首页 > 编程语言 >#yyds干货盘点# LeetCode程序员面试金典:从中序与后序遍历序列构造二叉树

#yyds干货盘点# LeetCode程序员面试金典:从中序与后序遍历序列构造二叉树

时间:2023-05-17 23:32:07浏览次数:41  
标签:yyds val idx int 金典 二叉树 root inorder postorder

题目:

给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。

 

示例 1:

输入:inorder = [9,3,15,20,7], postorder = [9,15,7,20,3]

输出:[3,9,20,null,null,15,7]

示例 2:

输入:inorder = [-1], postorder = [-1]

输出:[-1]

代码实现:

class Solution {
    int post_idx;
    int[] postorder;
    int[] inorder;
    Map<Integer, Integer> idx_map = new HashMap<Integer, Integer>();

    public TreeNode helper(int in_left, int in_right) {
        // 如果这里没有节点构造二叉树了,就结束
        if (in_left > in_right) {
            return null;
        }

        // 选择 post_idx 位置的元素作为当前子树根节点
        int root_val = postorder[post_idx];
        TreeNode root = new TreeNode(root_val);

        // 根据 root 所在位置分成左右两棵子树
        int index = idx_map.get(root_val);

        // 下标减一
        post_idx--;
        // 构造右子树
        root.right = helper(index + 1, in_right);
        // 构造左子树
        root.left = helper(in_left, index - 1);
        return root;
    }

    public TreeNode buildTree(int[] inorder, int[] postorder) {
        this.postorder = postorder;
        this.inorder = inorder;
        // 从后序遍历的最后一个元素开始
        post_idx = postorder.length - 1;

        // 建立(元素,下标)键值对的哈希表
        int idx = 0;
        for (Integer val : inorder) {
            idx_map.put(val, idx++);
        }
        
        return helper(0, inorder.length - 1);
    }
}

标签:yyds,val,idx,int,金典,二叉树,root,inorder,postorder
From: https://blog.51cto.com/u_13321676/6294683

相关文章

  • leetcode:二叉树的最大深度
    题目描述给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。示例:给定二叉树[3,9,20,null,null,15,7],3/\920/\157返回它的最大深度 3。题目链接:104.二叉树......
  • 6、二叉树和递归
    内容来自刘宇波老师玩转算法面试1、二叉树天然的递归结构二分搜索树2、一个简单的二叉树问题引发的血案3、注意递归的终止条件4、定义递归问题5、稍复杂的递归逻辑6、二分搜索树中的问题......
  • LeetCode 257. 二叉树的所有路径
    题目链接:LeetCode257.二叉树的所有路径题意:给你一个二叉树的根节点root,按任意顺序,返回所有从根节点到叶子节点的路径。解题思路:递归法采用递归法,就是一个dfs的过程,在遍历过程中,记录上路径即可。完整代码如下:varres[]stringvarpath[]intfuncbinaryTreePaths(......
  • LeetCode 111. 二叉树的最小深度
    题目链接:LeetCode111.二叉树的最小深度题意:给定一个二叉树,找出其最小深度。给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。解题思路:1.递归法与求最大深度类似,采用先序或者后序都是可以的,但是这里要注意一个问题:最小深度是从......
  • 力扣---1448. 统计二叉树中好节点的数目
    给你一棵根为 root 的二叉树,请你返回二叉树中好节点的数目。「好节点」X定义为:从根到该节点X所经过的节点中,没有任何节点的值大于X的值。 示例1:输入:root=[3,1,4,3,null,1,5]输出:4解释:图中蓝色节点为好节点。根节点(3)永远是个好节点。节点4->(3,4)是路径中......
  • 力扣---104. 二叉树的最大深度
    给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。示例:给定二叉树[3,9,20,null,null,15,7],3/\920/\157返回它的最大深度 3。来源:力扣(LeetCode)链接:https://leetcode......
  • LeetCode 101. 对称二叉树
    题目链接:LeetCode101.对称二叉树题意:给你一个二叉树的根节点root,检查它是否轴对称。解题思路:1.递归法采用递归法思路就比较简单,因为要比较二叉树是否是轴对称的,因此就是比较左右子树是否轴对称,因此在遍历的过程中,就是比较左边的左子树与右边的右子树是否相等,以及左......
  • LeetCode 226. 翻转二叉树
    题目链接:LeetCode226.翻转二叉树题意:给你一棵二叉树的根节点root,翻转这棵二叉树,并返回其根节点。解题思路:对于每一个节点,只需要考虑反转当前节点的左右子树即可,因此只需要考虑遍历顺序,本题中,采用前序和后序遍历都是可以的,但是中序遍历不行,如果采用中序,会将某些节点反转两......
  • LeetCode 94. 二叉树的中序遍历
    题目链接:LeetCode94.二叉树的中序遍历题意:给定一个二叉树的根节点root,返回它的中序遍历。解题思路:对于二叉树的遍历,有递归和非递归两种遍历方式,1.递归遍历**根据“左->根->右”的顺序,直接模拟即可。注意按照递归三部曲(递归的参数和返回值、递归的终止条件、单层......
  • 第五章 5.3.6找出二叉树中的前驱和后继结点
    中序线索二叉树找中序后继中序线索二叉树找中序前驱先序线索二叉树找先序后继先序线索二叉树找找先序前驱无法直接找到先序前驱,需要引入父节点指针(三叉链表),后序线索二叉树找后序前驱后序线索二叉树找后序后继找不到后序后继,需要通过三叉链表总结......