问题如下
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
分析 – 已知前序和后序
对于二叉树反向求解,认准递归是王道
public class TreeNode{
private int val;
public TreeNode left;
public TreeNode right;
public TreeNode(int val){
this.val = val;
}
}
public TreeNode reConstructBinaryTree(int []pre,int []in){
TreeNode root = reConstructBinaryTree(pre,0,pre.length-1,in,0,in.length-1);
}
public TreeNode reConstructBinaryTree(int []pre,int preStart,int preEnd,int []in,int inStart,int inEnd){
if(preStart>preEnd||inStart>inEnd){
return null;
}
TreeNode root = new TreeNode(pre[preStart]);
int i=inStart;
while(i<=inEnd){
//偏移量为:i-inStart
if(in[i]==root.val){
int provit = i-inStart;
root.left = reConstructBinaryTree(pre,preStart+1,preStart+provit,in,inStart,i-1);
root.right = reConstructBinaryTree(pre,preStart+provit+1,preEnd,in,i+1,inEnd);
break;
}
i++;
}
return root;
}
前序:根左右
中序:左根右
后序:左右根
已知其二,求完整的二叉树。
1:首先确立根的位置。
2:根的左右子树交给递归完成,分析其中的每次找到根径的偏移量。
已知前序和后序,求完整二叉树。
如图,已知前序(根左右)和后序(左右根)。
转折点在于-左边界,确立好,左边界以后,剩余的按照偏移量,递归运算,但是。