后序数组和中序数组获得二叉树结构

关于通过后序数组和中序数组获得二叉树结构

原题

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

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

例如:

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

    3
   / \
  9  20
    /  \
   15   7

解题思路

我们看到题目,在没有经验的前提下不要直接做题,即使知道是递归,也不要直接去构建递归方法(不知解题要点的前提下),我们要寻找递归的元素、特点。

寻找特点

我发现=>

  1. 中序第一位和后序第一位都是最左侧的叶子节点。
  2. 后序数组最后一位是根节点,倒数第二位是根节点右子树的根节点。
  3. 中序数组可以通过根节点划分分为左右两棵子树范围。

不一定每个特点都可以用得到,比如1,我的确知道左叶子节点,但是怎么去推导下一步。比如,获取他的右叶子节点,或者获取他的根节点,你没法确定吧?【其实做过的人知道,根节点是最重要的!】

那么我们看2、3,通过2、3特点

  • 我们根据根节点可以区分中序数组中当前范围的左右子树。
  • 后序最后一位是根节点root,那么倒着看,获取后序倒数第二位也是根节点,我们就叫这个点point。【注意:所有的节点其实都可以看作是根节点,只不过他的左右子树可能是NULL。】
  • 如果root的右子树范围不为空,那么这个点pointroot的右子树的根。
    反之,如果root的左子树不为空,这个点pointroot的左子树的根。
    如果这个点point左右范围都没有,那point就是叶子节点。 d.当范围重合为一个点时,这个点就是叶子节点。
  • 不管是右根节点,左根节点,还是叶子节点,你用了以后到要从后序数组最后“删除它”(就是不要他了,没利用价值了)。

构建思路

由此可以发现递归:
递归的参数->树的范围,树的根节点

你都有这两个了重要内容,递归的素材齐了

  • 每次获得根节点,建一个节点,从后序数组中删除它。
  • 然后区分他的左右树,先构建右子树,再构建左子树。

你会发现一个问题,每次我都要从后序拿一个值出来,如何放到递归里面呢?方法如下:

  1. 你把后序数组压入全局栈,一个一个pop。(栈删除方便,不用我们自己维护)
  2. 你定一个全局变量下标指向后序数组的最后一位,用一个节点,下标向前移动一位。(适合数组这种不好删的)
  3. 在递归方法中,传递后序数组的下标,你先递归右子树,没问题直接传递。但你下一步递归左子树的时候要注意了,下标要减去右子树长度。

总之,我把我的思路一步一步写在这里了,可能不清晰,如果有错误的地方,忘指正!

代码

/**
 * 时间:23.93% 内存:58.80%
 * */
private int rootIndex;
public TreeNode buildTree(int[] inorder, int[] postorder) {
    if(inorder.length!=postorder.length){
        return null;
    }
    rootIndex = postorder.length-1;
    return buildTree(inorder, postorder,0,inorder.length-1);
}

private TreeNode buildTree(int[] inorder,int[] postorder,int left,int right){
    if(rootIndex<0 || left>right){
        return null;
    }
    if(left == right){
        rootIndex--;
        return new TreeNode(inorder[left]);
    }
    int i;
    for (i = left; i <= right; i++) {
        if(inorder[i]==postorder[rootIndex]){
            rootIndex--;
            break;
        }
    }
    TreeNode node = new TreeNode(inorder[i]);
    node.right = buildTree(inorder,postorder,i+1,right);
    node.left = buildTree(inorder,postorder,left,i-1);
    return node;
}

作者:哒哒哒的咸鱼
链接:https://leetcode-cn.com/leetbook/read/data-structure-binary-tree/xo98qt/?discussion=1uozBZ

ps:哒哒哒的咸鱼就是我,一起加油吧!引用请告知,错误请指正,谢谢!!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值