ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-09-19 23:29:51  阅读:173  来源: 互联网

标签:遍历 int 106 二叉树 left inorder 节点 postorder


在这里插入图片描述

思路:

后序遍历:

[[左子树的前序遍历结果],[右子树的前序遍历结果],根节点]

中序遍历:

[[左子树的前序遍历结果],根节点,[右子树的前序遍历结果]]

从后往前遍历后序遍历序列,首先拿到整棵树的根节点的值
带着该值去中序遍历序列中找到该值的定位,将中序遍历分为左右两部分
得出左右两部分的长度之后,就可以在后序遍历序列中找到左子树的根节点和右子树的根节点,重复上述步骤

注意:

比较麻烦的是区间的更新

函数:

buildMyTree(
int[] inorder 中序遍历序列
,int[] postorder 后序遍历序列
,int inorder_left 当前树在中序遍历序列的左区间
,int inorder_right 当前树在中序遍历序列的左区间
,int postorder_left 当前树在中序遍历序列的左区间
,int postorder_right 当前树在中序遍历序列的左区间
)

1. 在后序遍历序列中获得根节点的值
2. 获得根节点在中序遍历序列中的定位
3. 构建根节点
4. 递归地遍历左子树,将左子树的根节点赋给根节点的左子节点
5. 递归地遍历右子树,将右子树的根节点赋给根节点的右子节点
6. 返回根节点

代码

class Solution {
    Map<Integer,Integer> map=new HashMap<>();
    public TreeNode buildMyTree(int[] inorder,int[] postorder,int inorder_left,int inorder_right,int postorder_left ,int postorder_right)
    {
        if(postorder_left>postorder_right)
        {
            return null;
        }
         int post=postorder[postorder_right];
         int in=map.get(post);
         //System.out.println(post+" "+in);
         int leftlen=in-1-inorder_left+1;
         int rightlen=inorder_right-(in+1)+1;
         TreeNode head=new TreeNode(post);
         head.left=buildMyTree(inorder,postorder,inorder_left,in-1,postorder_left,postorder_left+leftlen-1);
         head.right=buildMyTree(inorder,postorder,in+1,inorder_right,postorder_left+leftlen,postorder_right-1);
         return head;
    }

    public TreeNode buildTree(int[] inorder, int[] postorder) 
    {
        int n=inorder.length;
         for(int i=0;i<n;i++)
         {
             map.put(inorder[i],i);
         }
         return buildMyTree(inorder,postorder,0,n-1,0,n-1);
    }
}

标签:遍历,int,106,二叉树,left,inorder,节点,postorder
来源: https://blog.csdn.net/weixin_45823022/article/details/120386287

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有