重建二叉树--已知一个二叉树的前、中序排列,重建出该二叉树。
2017-08-03 01:03
274 查看
思考:
二叉树的前序遍历、后序遍历的规则,他们的规律是什么。列题:
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。思路:
前序遍历:先遍历根结点,然后遍历左子树,最后遍历右子树。中序遍历:先遍历左子树,然后遍历根结点,最后遍历右子树。
先序遍历第一个位置肯定是根节点node;
对于中序遍历,根节点位置在中间p,p左边的节点位于二叉树的左边,p右边的节点位于二叉树的右边;
先序遍历的第二个位置到p,也是node左子树的先序子数组,剩下p右边的就是node的右子树的先序子数组。
核心代码:
/* pre: 前序遍历结果; startPre: 前序遍历的开始位置; endPre: 前序遍历的结束位置; in: 中序遍历结果; startIn: 中序遍历的开始位置; endIn: 中序遍历的结束位置 */ public 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); } } return root; }
更多二叉树的基础说明请参见:http://blog.csdn.net/ink4t/article/details/75127726
相关文章推荐
- 二叉树的重建 已知前序 中序 求后序 递归的方法
- 已知二叉树的前序和中序,重建二叉树_笔记
- 已知二叉树的后序和中序排列,求先序排列再线索化的问题(笔试常考)
- 已知二叉树前序遍历和中序遍历的结果,重建二叉树
- 已知二叉树的中序和后序遍历排列,求前序遍历
- 重建二叉树,给出一个二叉树的前序和中序遍历,恢复二叉树的结构
- 【面试算法系列】已知二叉树的前序和中序遍历重建二叉树 - C语言实现
- 已知二叉树的前序遍历和中序遍历重建二叉树(二叉树)
- 已知二叉树的后序和中序排列,求先序排列再线索化的问题(笔试常考)
- 已知二叉树的先序排列和中序排列,重构该二叉树,并输出该树的后序遍历
- 二叉树知道前序中序或者中序后序求另外一个排列
- 已知一棵二叉树的中序序列和后序序列,写一个建立该二叉树的二叉链表存储结构的算法
- 剑指offer——已知二叉树的先序和中序排列,重构二叉树
- 二叉树的重建--已知中序和前序或中序和后序逆向构建二叉树
- 已知二叉树的前序遍历和中序遍历的结果,重建二叉树
- 已知前序遍历和中序遍历,重建二叉树
- 根据前序遍历和中序遍历重建二叉树
- 根据二叉树的先序和中序遍历重建二叉树
- 已知先序和中序构建二叉树并且以层序输出
- 面试题6:重建二叉树,输入某二叉树的前序遍历和中序遍历的结果,重建出该二叉树。