1 二叉树
2 二叉树的遍历
3 二叉树的重建
4 代码实现
1 二叉树
在计算机科学中,二叉树是每个结点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于实现二叉查找树和二叉堆。
一棵深度为k,且有2^k-1个节点的二叉树,称为满二叉树。这种树的特点是每一层上的节点数都是最大节点数。而在一棵二叉树中,除最后一层外,若其余层都是满的,并且最后一层或者是满的,或者是在右边缺少连续若干节点,则此二叉树为完全二叉树。具有n个节点的完全二叉树的深度为log2(n+1)。深度为k的完全二叉树,至少有2k-1个节点,至多有2k-1个节点。
2 二叉树的遍历
下面链接写的很详细
http://blog.csdn.net/xiaotan2011929/article/details/61427919
http://blog.csdn.net/Dean_Deng/article/details/47053231
http://blog.csdn.net/u014744118/article/details/50983826
3 二叉树的重建
下面链接写的很详细
前序 + 中序 重建
https://www.jianshu.com/p/07ac60fd2e5c
http://blog.csdn.net/lemon_tree12138/article/details/49798221
中序 + 后序 重建
https://blog.csdn.net/wu2304211/article/details/54709205
4 代码实现
4.1 算法思路:先找中序遍历和先序遍历相等的值,该值的坐标就是左子树,右边就是右子树,循环递归该算法即可完成建树。
步骤如下:
- 确定树的左右子树:找到中序遍历和先序遍历相等的值,确定左右子树。
- 确定左右子树方法:
- 先序遍历左子树范围 = 先序遍历左子树起始节点坐标 + 1 , 中序遍历左子树范围 + 先序遍历的起始点位置(这个是主要的一个点);
- 先序遍历右子树范围 = 中序遍历左子树范围 + 先序遍历的起始点位置 + 1 , 先序遍历右子树结束节点
- 中序遍历左子树范围 = 中序遍历左子树起始点坐标 , 中序遍历左子树的结束节点(就是i:分出左右子树)-1;
- 中序遍历右子树范围 = 中序遍历左子树的结束节点(就是i:分出左右子树)+ 1,中序遍历右子树结束节点
- 对应代码如下:
private static TreeNode reConstructBinaryTree(int[] pre, int startPre, int endPre, int[] in, int startIn, int endIn) {
if (startPre > endPre || startIn > endIn)
return null;
TreeNode root = new TreeNode(pre[startPre]);
for (int i = startIn; i <= endIn; i++)
if (in[i] == pre[startPre]) {
root.left = reConstructBinaryTree(pre, startPre + 1, i - startIn + startPre, in, startIn, i - 1);
root.right = reConstructBinaryTree(pre, i - startIn + startPre + 1, endPre, in, i + 1, endIn);
break;
}
return root;
}
END
网友评论