重建二叉树
2017-03-31 21:15
148 查看
简介
重建二叉树指的是在给出二叉树节点的几种遍历顺序的条件下,让求出其原二叉树的结构。其实只要已知其中序遍历和另一种遍历,就足以重建二叉树了。重建方法
比如给出某二叉树的前序遍历{1,2,4,7,3,5,6,8}和其中序遍历{4,7,2,1,5,3,8,6},那么,我们可以很明显的知道此二叉树的根结点是1,又由中序遍历知道{4,7,2}是此二叉树的左子树,对应的前序遍历是{2,4,7},而原二叉树的右子树就是{5,3,8,6}了,其对应的前序遍历就是{3,5,6,8}了,然后再递归重建左右子树直到子树为空。思路明了后,我们就能很容易地写出代码了
附代码:
class Solution4 { public void preTravel(TreeNode root){ if(root != null){ System.out.print(root.val+" "); preTravel(root.left); preTravel(root.right); } } public TreeNode reConstructBinaryTree(int [] pre,int [] in) { if(pre == null || pre.length <= 0) return null; TreeNode root = new TreeNode(Integer.MAX_VALUE);//根结点,最大值表示为空 //重建子树 reBuildSonTree(root, pre, 0, pre.length-1, in, 0, in.length-1); return root; } public void reBuildSonTree(TreeNode root, int []pre , int start1, int end1,int[] in , int start2, int end2){ if(end1-start1 < 0) return ; int leftCont = 0 ,rightCnt = 0 ;//分别记录左右子树节点数 root.val = pre[start1]; for(int i = start2 ; i <= end2; i ++){ if(in[i] == pre[start1]){ leftCont = i - start2; rightCnt = end2 - i; break; } } if(leftCont >= 1) root.left = new TreeNode(0);//存在则初始化 reBuildSonTree(root.left, pre, start1+1, start1+leftCont, in, start2, start2+leftCont-1); if(rightCnt >= 1) root.right = new TreeNode(0); reBuildSonTree(root.right, pre, start1+leftCont+1, end1, in, start2+leftCont+1, end2); return ; } }
相关文章推荐
- 剑指Offer笔记—— 从尾到头打印链表 重建二叉树
- 剑指offer之重建二叉树 九度1385
- 剑指Offer-7:重建二叉树
- 重建二叉树
- 重建二叉树
- 剑指Offer(四)重建二叉树
- UVa 二叉树重建(先序+中序求后序)
- java实现——006重建二叉树
- 重建二叉树(根据 前序 和 中序二叉树)
- 剑指Offer学习总结-重建二叉树
- 二叉树的遍历及重建
- 剑指Offer面试题6[重建二叉树]
- 剑指offer-重建二叉树 java实现
- 编程之美--重建二叉树
- 剑指offer-面试题6:重建二叉树
- 重建二叉树
- 剑指offer 面试题6—重建二叉树
- 重建二叉树
- 二叉树的重建
- 剑指offer---面试题6重建二叉树