算法复习:二叉树的镜像

题目描述

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

解题思路

前序遍历中的第一个数字是书的根结点,再重中序遍历中找到根节点,其左边为根的左子树的中序遍历,其右边为根的右子树的中序遍历。由于前序遍历中,紧跟在根节点之后的是左子树,而且长度已知,故可求出左子树和右子树的前序遍历和中序遍历,接着递归即可。
递归的出口:只剩下一个相同数字时即可返回。
代码:

  public TreeNode reConstructBinaryTree(int[] pre, int[] in) {
    if (pre.length == 0)
        return null;

    if(pre[0] == in[0] && pre.length == 1)return new TreeNode(pre[0]);

    int root = pre[0];
    TreeNode tnRoot = new TreeNode(root);
    tnRoot.left = tnRoot.right = null;

    int i = 0;
    for(;i < in.length;i++){
        if(in[i] == root)
        break;
    }

    int[] leftPre = new int[i];
    for(int j = 0,k = 1;k < i + 1;j++,k++){
        leftPre[j] = pre[k];
    }

    int[] leftIn = new int[i];
    for(int j = 0;j < i;j++){
        leftIn[j] = in[j];
    }

    int[] rightPre = new int[pre.length - i -1];
    for(int j = 0,k = i + 1;k < pre.length;j++,k++){
        rightPre[j] = pre[k];
    }

    int[] rightIn = new int[pre.length - i -1];
    for(int j = 0,k = i + 1;k < in.length;j++,k++){
        rightIn[j] = in[k];
    }

    tnRoot.left = reConstructBinaryTree(leftPre,leftIn);
    tnRoot.right = reConstructBinaryTree(rightPre,rightIn);

    return tnRoot;
}

代码写得比较随意,不太规范,具体见《剑指offer》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值