-
我们知道通过先序和中序遍历结果可以还原一颗二叉树,那么相应的知道后序和和中序遍历结果也是可以还原一课二叉树的,往下看…
在知道后序和中序遍历的原理之后,我们也可以反推出一颗树。思路:
- 1)后序遍历的最后一位即是二叉树的根节点。
- 2)然后再中序遍历找到根结点,根节点左边的所有序列便是左子树的中序遍历结果,右边的所有序列便是右子树中序遍历结果。
- 3)在后序遍历中找到对应的左子树,右子树。
- 4)在左右子树的先序和中序结果中继续重复1 , 2 ,3步骤,便可还原二叉树。
- 如下图:
具体代码实现:
/**
* 二叉树结点
*/
public class TreeNode {
public int val;
public TreeNode left;
public TreeNode right;
public TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
public TreeNode(int val) {
this.val = val;
}
}
public static int findRootIndex(int[] arr, int val){
for(int i = 0; i < arr.length; i++){
if(arr[i] == val) return i;
}
return -1;
}
/**
* 根据后序和中序还原二叉树
*/
public static TreeNode buildTree(int[] lst, int[] mid){
if(lst == null || mid == null || lst.length == 0 || mid.length == 0 || lst.length != mid.length)return null;
//从后序遍历中找到根节点
TreeNode root = new TreeNode(lst[lst.length-1]);
//找到在中序中根节点的位置
int rootIndex = findRootIndex(mid,root.val);
//找到左子树的后序和中序
int[] leftLst = Arrays.copyOfRange(lst,0,rootIndex);
int[] leftMid = Arrays.copyOfRange(mid,0,rootIndex);
//找到右子树的后序和中序
int[] rightLst = Arrays.copyOfRange(lst,rootIndex,lst.length-1);
int[] rightMid = Arrays.copyOfRange(mid,rootIndex+1,mid.length);
//递归,构建左右子树
TreeNode left = buildTree2(leftLst,leftMid);
TreeNode right = buildTree2(rightLst,rightMid);
//将左右子树添加到当前的根节点
root.left = left;
root.right = right;
return root;
}
public class Main {
public static void main(String[] args) {
int[] mid = new int[]{4,2,5,1,3,6};
int[] lst = new int[]{4,5,2,6,3,1};
TreeNode root = buildTree2(lst,mid);
System.out.println(root);
//System.out.println(root.val);
}
查看还原结果:
还原成功~