剑指Offer [04] 重建二叉树

来源:互联网 发布:手机淘宝怎么复制宝贝 编辑:程序博客网 时间:2024/05/19 00:36

重建二叉树 : 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列 {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;    }}
原创粉丝点击