您的位置:首页 > 其它

算法:二叉树的重建

2017-07-12 18:37 246 查看
首先前序遍历特性,根节点在第一个,然后后面是左子树,然后是右子树。

而中序遍历,首先出现的是左子树,然后是根节点,然后是右子树。

然后就可以用递归方法,将前序遍历的第一个数值和中序遍历比较,找到中序遍历中的根节点。中序遍历中的该节点左边为左子树,右边为右子树。再用同样的方法找到左右子树的根节点,依次递归

/**
* Definition for binary tree
* public class TreeNode {
*     int val;
*     TreeNode left;
*     TreeNode right;
*     TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public TreeNode reConstructBinaryTree(int[] pre,int[] in) {

TreeNode root=reConstructBinaryTree(pre,0,pre.length-1,in,0,in.length-1);

return root;
}

/*
*
* @param PreOrder
*            前序遍历序列
* @param startPreIndex
*            前序序列开始位置
* @param endPreIndex
*            前序序列结束位置
* @param InOrder
*            中序遍历序列
* @param startInIndex
*            中序序列开始位置
* @param endInIndex
*            中序序列结束位置
*/
private 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,startPre+i-startIn,in,startIn,i-1);
//递归
// 前序遍历中:下一个的左树的根节点是前序遍历数组的第二个,结束位置是(i-中序开始+前序开始)
// 中序遍历中:下个左树的根节点是开始,结束是i-1

root.right=reConstructBinaryTree(
pre,i-startIn+startPre+1,endPre,in,i+1,endIn);
//前序遍历中: 右树的根节点是前序遍历数组的第(i+1-中序开始+前序开始)结束位置是前序结尾
//中序遍历中:右树是i+1----结尾
}

4000
}

return root;
}
}


public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: