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


题目描述

给定两个整数数组 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]

提示:

1 <= inorder.length <= 3000
postorder.length == inorder.length
-3000 <= inorder[i], postorder[i] <= 3000
inorder 和 postorder 都由 不同 的值组成
postorder 中每一个值都在 inorder 中
inorder 保证是树的中序遍历
postorder 保证是树的后序遍历

解题思路

我感觉这道题的注释不是很好写的很清晰,建议先看一下另外一道题的思路:最大二叉树
然后回来再看这道题的注释就会清晰很多

代码

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

    //这个函数负责构造二叉树
    public TreeNode build(int[] inorder,int leftIndex,int rightIndex,int[] postorder,int postLeftIndex,int postRightIndex){

        //如果left坐标小于right坐标,则表明是一个空树,也是递归出口
        if (leftIndex>rightIndex||postLeftIndex>postRightIndex){
            return null;
        }
        //构造根节点
        TreeNode root  = new TreeNode(postorder[postRightIndex]);
        //找到根节点在中序遍历中的位置
        int rootIndex = 0;
        for (int i = leftIndex; i <= rightIndex; i++) {
            if (inorder[i]==root.val){
                rootIndex=i;
                break;
            }
        }
        //中序遍历中rootIndex-leftIndex表示左子树有多少个节点
        int lenOfLeft = rootIndex-leftIndex;
        //寻找左子树的根节点,最后一个参数表示左子树的后序遍历序列结束的位置
        TreeNode leftChild = build(inorder,leftIndex,rootIndex-1,postorder,postLeftIndex,postLeftIndex+lenOfLeft-1);
        //寻找右子树的根节点
        TreeNode rightChild = build(inorder,rootIndex+1,rightIndex,postorder,postLeftIndex+lenOfLeft,postRightIndex-1);
        //root分别指向左子树和右子树
        root.left = leftChild;
        root.right = rightChild;
        return root;
    }
}

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-14 13:06:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-14 13:06:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-14 13:06:01       82 阅读
  4. Python语言-面向对象

    2024-03-14 13:06:01       91 阅读

热门阅读

  1. 大带宽服务器怎么租详细过程

    2024-03-14 13:06:01       39 阅读
  2. 字符串和字节的使用

    2024-03-14 13:06:01       38 阅读
  3. redis中setnx命令的底层原理是什么

    2024-03-14 13:06:01       34 阅读
  4. MyBatis-Plus IgnoreStrategy:深入解析与策略应用

    2024-03-14 13:06:01       40 阅读
  5. ES6基础1

    2024-03-14 13:06:01       38 阅读
  6. 单元测试框架unittest D16

    2024-03-14 13:06:01       40 阅读
  7. 聊聊js数据结构

    2024-03-14 13:06:01       34 阅读
  8. Docker之自定义镜像上传阿里云

    2024-03-14 13:06:01       38 阅读
  9. 蓝桥杯2023年-岛屿个数(dfs,染色法)

    2024-03-14 13:06:01       38 阅读