您的位置:首页 > Web前端

剑指Offer [04] 重建二叉树

2017-08-21 19:57 330 查看
重建二叉树 : 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列 {1,2,4,7,3,5,6,8} 和中序遍历序列 {4,7,2,1,5,3,8,6},则重建二叉树并返回。

思路:

前序遍历的第一个点一定是根节点

中序遍历中,根节点左边为其左子树,右边为其右子树

注意点:

递归调用过程中函数的参数值,应该多举例验证下是否正确

package A04重建二叉树;

public class Solution {
public class TreeNode {
int val;
TreeNode left;
TreeNode right;

TreeNode(int x) {
val = x;
}
}

public TreeNode reConstructBinaryTree(int[] pre, int[] in) {
TreeNode root = cal(pre, 0, pre.length-1, in, 0, in.length-11);
return root;
}

public TreeNode cal(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]);
for(int i=inStart;i<=inEnd;i++){
// 找到根节点在中序遍历中的索引
if (pre[preStart] == in[i]) {
// 左孩子,在前序遍历中,起点将比根节点索引大 1 ,终点将是 i 的偏移位数 - 1
root.left = cal(pre, preStart+1, preStart+i-inStart, in, inStart, i-1);
root.right = cal(pre, i-inStart+preStart+1, preEnd, in, i+1, inEnd);
}
}
return root;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  二叉树 递归