链接
牛客:重建二叉树
题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
思路
前序遍历的第一个值为根节点的值,使用这个值将中序遍历结果分成两部分,左部分为树的左子树中序遍历结果,右部分为树的右子树中序遍历的结果。这里就涉及到分治的思想,就可以想到会用到递归,事实上,递归在树中是作为一种非常常见的遍历方式,譬如前序遍历和中序遍历。
代码
public class Solution {
public TreeNode reConstructBinaryTree(int[] pre, int[] in) {
int n = pre.length;
return CreateByPreMid(pre, in, 0, 0, n);
}
/** index_pre是pre数组的下标 index_in是in数组的下标
* n是二叉树的大小
* 先序遍历的首节点就是根节点 所以pre[index_pre]就是树根节点的值、
* 再找到中序遍历中对应的值 该值左边的值就是左子树对应的 右边的值就是右子树对应的
* 左子树 右子树的情况同样如此
*/
public TreeNode CreateByPreMid(int[] pre, int[] in, int index_pre, int index_in, int n) {
if (n == 0)
return null;
TreeNode p = new TreeNode(0);
p.val = pre[index_pre];
int i; //这里的i相当于左子树的个数
for (i = 0; i < n; i++) {
if (pre[index_pre] == in[index_in + i])
break;
}
p.left = CreateByPreMid(pre, in, index_pre + 1, index_in, i);
p.right = CreateByPreMid(pre, in, index_pre + i + 1, index_in + i + 1, n - i - 1);
return p;
}
}