剑指-重建二叉树

题目:

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

思路:

根据先序遍历的第一个结点1为根节点,可以将中序遍历序列划分为两个部分,左侧{4,7,2}是根节点的左子树中序序列,右侧{5,3,8,6}是根节点的右子树中序序列.
同时,也可以将先序遍历序列划分为三部分,1为根节点,{2,4,7}为左子树的先序序列,{3,5,6,8}为右子树的先序序列.

这样就可以把一个较大规模的问题转化为更小规模的问题.

知道先序序列{2,4,7},中序序列{4,7,2},重建二叉树.
知道先序序列{3,5,6,8},中序序列{5,3,8,6},重建二叉树.
这两个二叉树是以1为根节点的.

根据这种思路,很容易写出来递归代码.

private static class Node {
    Node left;
    Node right;
    char value;
}

static Node rebuild(String preOrder, String inOrder) {

    if (preOrder == null || inOrder == null) {
        return null;
    }

    if (preOrder.length() == 0 || inOrder.length() == 0) {
        return null;
    }

    if (preOrder.length() != inOrder.length()) {
        return null;
    }

    Node root = new Node();
    root.value = preOrder.charAt(0);
    root.left = null;
    root.right = null;

    int preRootIndex = preOrder.indexOf(root.value);
    int inRootIndex = inOrder.indexOf(root.value);

    String leftInOrder = inOrder.substring(0, inRootIndex);
    String rightInOrder = inOrder.substring(inRootIndex + 1, inOrder.length());

    int leftLen = leftInOrder.length();

    String leftPreOrder = preOrder.substring(preRootIndex + 1, preRootIndex + 1 + leftLen);
    String rightPreOrder = preOrder.substring(preRootIndex + 1 + leftLen, preOrder.length());

    if (leftPreOrder.length() > 0 && leftInOrder.length() > 0) {
        root.left = rebuild(leftPreOrder, leftInOrder);
    }
    if (rightPreOrder.length() > 0 && rightInOrder.length() > 0) {
        root.right = rebuild(rightPreOrder, rightInOrder);
    }

    return root;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值