二叉树算法题(12)从中序与后续遍历序列构造二叉树

目录

从中序与后续遍历序列构造二叉树

描述

示例

方法:递归


从中序与后续遍历序列构造二叉树

描述

根据一棵树的中序遍历后序遍历构造二叉树。

注意:你可以假设树中没有重复的元素。

示例

中序遍历 inorder = [9,3,15,20,7]
后序遍历 postorder = [9,15,7,20,3]
返回如下的二叉树:

    3
   / \
  9  20
    /  \
   15   7

 

方法:递归

我们可以根据中序遍历和后序遍历的特点来做这个题。

后序遍历数组的最后一个元素为根节点,然后可以在中序遍历数组中找这个根节点的位置,根节点左边的都是左子树的元素,根节点右边的都是右子树的元素,由此我们可以将中序数组和后序数组按左右子树分为两个数组,接着我们递归构造左右子树。

class Solution {
    public TreeNode buildTree(int[] inorder, int[] postorder) {
        return reCur(inorder,0,inorder.length-1,postorder,0,postorder.length-1);
    }

    public TreeNode reCur(int[] inorder,int inlow,int inhigh, int[] postorder,int postlow,int posthigh){
        if (inlow>inhigh) return null;//如果越界,直接返回
        int rootValue=postorder[posthigh];//根节点的值
        TreeNode root=new TreeNode(rootValue);//构造根节点
        int i;//指示根节点在中序遍历中的下标
        for (i = inlow; i <= inhigh; i++) {
            if (inorder[i]==rootValue) break;//找到根节点在中序遍历数组中的位置
        }//此时根节点左边的都为左子树节点,右边的都为右子树节点
        root.left=reCur(inorder,inlow,i-1,postorder,postlow,postlow+i-inlow-1);//递归构造左子树
        root.right=reCur(inorder,i+1,inhigh,postorder,postlow+i-inlow,posthigh-1);//递归构造右子树
        return root;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值