前言
之前进行了二叉树的先序中序后序打印,那么反过来怎么把先序中序还原出二叉树呢?
一、二叉树示例
二、思路
写一下节点信息
先序+中序:pre + in
head = pre[0] = in[3] ;
head.left = pre[1 … 3] = pre[1] = in[0 … 2] = in[1]
head.left.left = pre[2] = in[0]
head.left.right = pre[3] = in[2]
head.right = pre[4 … 6] = pre[4] = in[4 … 6] = in[5]
head.right.left = pre[5] = in[4]
head.right.right = pre[6] = in[6]
考虑递归实现
假设有一个函数f(int[]pre,int l1,int r1,int[]in,int l2,int r2) 可以把先序l1-r1位置,中序l2-r2位置合并出一个TreeNode节点,画出递归的操作逻辑
public TreeNode f(int[] pre, int L1, int R1, int[] in, int L2, int R2){
//终止条件
//1. null终止
if(L1>R1){
return null;
}
TreeNode head = new TreeNode(pre[L1]);
//2. 碰撞终止
if(L1==R1){
return head;
}
// find是移动的,找到当前头
int find = L2;
while (in[find] != pre[L1]) {
find++;
}
//左节点
head.left = f(pre, L1 + 1, L1 + find - L2, in, L2, find - 1);
//右节点
head.right = f(pre, L1 + find - L2 + 1, R1, in, find + 1, R2);
return head;
}