当前位置: 首页 > article >正文

中序和前/后序遍历构造二叉树———通用做法

1. 前序和中序遍历

在这里插入图片描述

**思路:我们每一次一定可以根据递归确定根节点是哪个,就是前序第一个数,然后找中序遍历这个点,看左子树有几个节点,右子树有几个节点,然后就可以根据节点个数,递归左子树和右子树,当且仅当left>right时结束,由于preorder和inorder对应的所以left>right只需要判断一个符不符合就行了。**8个位置的判断一定要仔细。借助hashmap确定中序遍历某个节点的位置。

class Solution {
    Map<Integer,Integer> mp = new HashMap();
    int n;
    TreeNode PreMidTreeBuilder(int[] preorder,int[] inorder,
            int preorder_left, int preorder_right, int inorder_left, int inorder_right){
        if(preorder_left>preorder_right) return null;
        TreeNode root = new TreeNode(0,null,null);
        int rootNodeVal = preorder[preorder_left];
        root.val = rootNodeVal;
        //定位到中序遍历的位置
        int inorderRoot = mp.get(rootNodeVal);
        //可以根据坐标定下来左右子树的节点数量
        int leftLength = inorderRoot-inorder_left;
        int rightLength = inorder_right-inorderRoot;
        root.left=
            PreMidTreeBuilder(preorder,inorder,preorder_left+1,preorder_left+leftLength,
                            inorder_left,inorderRoot-1);    
        root.right=
            PreMidTreeBuilder(preorder,inorder,preorder_left+leftLength+1,preorder_right,
                            inorderRoot+1,inorder_right);
        return root;
    }
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        n = preorder.length;
        for(int i=0;i<n;i++)
            mp.put(inorder[i],i);
        return PreMidTreeBuilder(preorder,inorder,0,n-1,0,n-1);
    }
}

2. 中序和后序遍历

和前序+中序完全一样的思路,可以说所有这种题都是这个思路。

class Solution { 
    Map<Integer,Integer> map = new HashMap<>();
    public TreeNode buildInPostTree(int[] inorder, int[] postorder,
                    int inorder_left,int inorder_right,int postorder_left,int postorder_right)
    {
        if(inorder_left>inorder_right)return null;
        int val = postorder[postorder_right];
        int inorder_root = map.get(val);
        int nums_left_tree = inorder_root-inorder_left;
        int nums_right_tree = inorder_right-inorder_root;
        TreeNode root = new TreeNode(val,null,null);
        root.left = buildInPostTree(inorder,postorder,inorder_left,inorder_left+nums_left_tree-1,
                                    postorder_left,postorder_left+nums_left_tree-1);
        root.right = buildInPostTree(inorder,postorder,inorder_root+1,inorder_right,
                                    postorder_right-nums_right_tree,postorder_right-1);
        return root; 
    }
    public TreeNode buildTree(int[] inorder, int[] postorder) {
        int n = inorder.length;
        for(int i=0;i<n;i++)
            map.put(inorder[i],i);
        return buildInPostTree(inorder,postorder,0,n-1,0,n-1);
    }
}

http://www.kler.cn/a/155405.html

相关文章:

  • 容器技术在DevOps中的应用
  • 【mysql】使用宝塔面板在云服务器上安装MySQL数据库并实现远程连接
  • 2024-11-13 学习人工智能的Day26 sklearn(2)
  • 卓胜微嵌入式面试题及参考答案(2万字长文)
  • SpringCloud学习笔记
  • 详解基于C#开发Windows API的SendMessage方法的鼠标键盘消息发送
  • 15个Pandas代码片段助力数据分析
  • MySQL索引:优化数据访问的双面剑
  • LeetCode:2336. 无限集中的最小数字(hash模拟 C++)
  • ZooKeeper的分布式锁---客户端命令行测试(实操课程)
  • 9-4 函数输入信息,函数输出信息
  • pytest系列——allure之在测试用例添加标题(@allure.title())
  • KALI LINUX高级话题
  • LeetCode二分查找:x 的平方根
  • 什么是npm?能干什么?
  • 不得不说,HelpLook真的是一个很懂用户的文档管理工具
  • Uniapp
  • 调优--学习笔记
  • SCA技术进阶系列(四):DSDX SBOM供应链安全应用实践
  • 组合总和II(回溯、去重)
  • ROS报错:RLException:Invalid roslaunch XML Syntax: mismatched tag:
  • MFC 绘制单一颜色圆形、渐变颜色边框圆形、渐变填充圆形以及绘制三角函数正弦函数曲线.
  • 【web安全】CSRF漏洞攻击与防御
  • 从零开始:PHP实现阿里云直播的简单方法!
  • Java通过Redis进行延时队列,定时发布消息(根据用户选择时间进行发布)
  • python爬虫抓取网页图片教程