您的位置:首页 > 其它

重建二叉树--已知一个二叉树的前、中序排列,重建出该二叉树。

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  二叉树 遍历 算法
相关文章推荐