★【递归】【构造二叉树】Leetcode 106.从中序与后序遍历序列构造二叉树

★【递归前序】【构造二叉树】Leetcode 106.从中序与后序遍历序列构造二叉树 105. 从前序与中序遍历序列构造二叉树

  • 106.从中序与后序遍历序列构造二叉树
    • :star:思路分析
    • 递归解法
  • 105. 从前序与中序遍历序列构造二叉树
    • 递归解法

凡是构造二叉树>>>>>>>>>>前序遍历(中左右)
---------------🎈🎈题目链接🎈🎈-------------------

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

在这里插入图片描述

⭐️思路分析

后序数组: 左 右 中
中序数组: 左 中 右
以后序数组的最后一个元素(即为根节点)为切割点,先切中序数组,
再根据中序数组的左长度,反过来再切后序数组的左和右。
一层一层切下去,每次后序数组最后一个元素就是节点元素。

在这里插入图片描述

递归解法

在这里插入图片描述
⭐️⭐️⭐️⭐️⭐️⭐️
1. 如果数组大小为0,说明是空节点,return null
2. 如果不为空,那么取后序数组的最后一个节点
3. 找到后序数组最后一个节点 在中序数组中的位置 作为切割点
4. 切割中序数组,切成中序左数组 和 中序右数组
5. 根据中序左数组的长度,切割后序数组,切成后序左数组和后序右数组
6. 递归处理左区间和右区间

时间复杂度O(N)
空间复杂度O(N)
采用了【左闭右闭】——只要一直保持一致就行

java">/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public TreeNode buildTree(int[] inorder, int[] postorder) {
        //1.如果数组为空 那么就返回null
        if(inorder.length ==0 || postorder.length==0){
            return null;
        }
        return helper(inorder, postorder, 0, inorder.length-1, 0,postorder.length-1);
        //

    }
    public TreeNode helper(int[] inorder, int[] postorder, int inorderBegin, int inorderEnd, int postorderBegin, int postorderEnd){
        if(postorderBegin > postorderEnd){
            return null;
        }
        // 采用左闭右闭
        //2.如果不为空, 那么就取后序数组的最后一个元素
        int rootval = postorder[postorderEnd];
        TreeNode root= new TreeNode(rootval);

        //3.切割中序数组 得到对应中序数组中rootval所在的位置  进而得到中序左数组 中序右数组
        int midIndex;
        for(midIndex = inorderBegin; midIndex<=inorderEnd; midIndex++){
            if(inorder[midIndex] == rootval){
                break;
            }
        }
        int leftInorderBegin = inorderBegin;  // 中序左数组开头
        int leftInorderEnd = midIndex-1;      // 中序左数组结尾
        int rightInorderBegin = midIndex+1;    // 中序右数组开头
        int rightInorderEnd =  inorderEnd;     // 中序右数组结尾

        //4.根据中序左数组 切割后序数组,得到后序左数组 后序右数组
        int leftPostorderBegin = postorderBegin;                 // 后序左数组开头
        int leftPostorderEnd = postorderBegin + midIndex -inorderBegin -1;         // 后序左数组结尾
        int rightPostorderBegin = leftPostorderEnd+1;           // 后序右数组开头
        int rightPostorderEnd = postorderEnd-1;                  // 后序右数组结尾

        //5.递归处理左子树和右子树
        root.left = helper(inorder, postorder, leftInorderBegin, leftInorderEnd, leftPostorderBegin, leftPostorderEnd);
        root.right = helper(inorder, postorder, rightInorderBegin, rightInorderEnd, rightPostorderBegin, rightPostorderEnd);
        return root;
    }
}

105. 从前序与中序遍历序列构造二叉树

递归解法

⭐️⭐️⭐️⭐️⭐️⭐️
接受参数int[ ] preorder, int[ ] inorder, preorder的开始,preorder的结束,inorder的开始,inorder的结束
1. 如果数组大小为0,说明是空节点,return null
2. 从前序的第一个得到根节点root
3. 根据midval 在中序数组inorder中 寻找切割点midindex
4. 对中序数组inorder进行切割 :中序左(begin/end) 中序右(begin/end)
5. 根据分化结果,对前序数组preorder进行切割 :前序左(begin/end) 前序右(begin/end)
6. 进行左右子树构建递归

java">/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        // 采用左闭右闭
        if(preorder.length == 0) return null;
        return helper(preorder, inorder, 0, preorder.length-1, 0, inorder.length-1);
    }
    public TreeNode helper(int[] preorder, int[] inorder, int preorderBegin, int preorderEnd, int inorderBegin, int inorderEnd){
        // 接受参数int[] preorder, int[] inorder, preorder的开始,preorder的结束,inorder的开始,inorder的结束

        // 1.如果数组大小为0,说明是空节点,return null
        if(preorderBegin > preorderEnd){
            return null;
        }

        // 2.从前序的第一个得到根节点root
        int midval = preorder[preorderBegin];
        TreeNode root = new TreeNode(midval);

        // 3. 根据midval 在中序数组inorder中 寻找切割点midindex
        int midindex;
        for(midindex = inorderBegin; midindex<=inorderEnd; midindex++){
            if(inorder[midindex] == midval){
                break;
            }
        }

        // 4.对中序数组inorder进行切割 :中序左(begin/end) 中序右(begin/end)
        int inorderLeftBegin = inorderBegin;
        int inorderLeftEnd = midindex-1;
        int inorderRightBegin =midindex+1;
        int inorderRightEnd = inorderEnd;

        // 5.根据分化结果,对前序数组preorder进行切割 :前序左(begin/end) 前序右(begin/end)
        int preorderLeftBegin = preorderBegin+1;
        int preorderLeftEnd = preorderLeftBegin + midindex-inorderBegin-1;
        int preorderRightBegin = preorderLeftEnd+1;
        int preorderRightEnd = preorderEnd;

        // 进行左右子树构建递归
        root.left = helper(preorder, inorder, preorderLeftBegin,preorderLeftEnd, inorderLeftBegin, inorderLeftEnd); //左
        root.right = helper(preorder, inorder, preorderRightBegin,preorderRightEnd, inorderRightBegin, inorderRightEnd); //右
        return root;

    }
}

http://www.niftyadmin.cn/n/5394979.html

相关文章

Qt QWidget 简约美观的加载动画 第五季 - 小方块风格

给大家分享两个小方块风格的加载动画 &#x1f60a; 第五季来啦 &#x1f60a; 效果如下: 一个三个文件,可以直接编译运行 //main.cpp #include "LoadingAnimWidget.h" #include <QApplication> #include <QGridLayout> int main(int argc, char *arg…

电梯物联网之梯控相机方案-防止电瓶车进电梯

梯控现状 随着电梯产品在智能化建筑的日益普及,对于电梯的智能化管理 安全性需求 的要求越来越迫切。尤其今年来随着电瓶车的大量普及&#xff0c;发起多起楼道、轿厢电瓶车着火恶性事件&#xff0c; 造成了极大的社会 负面影响。控制电瓶车进入单元门&#xff0c;楼道以及电梯…

LeetCode题练习与总结:四数之和

一、题目 给你一个由 n 个整数组成的数组 nums &#xff0c;和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] &#xff08;若两个四元组元素一一对应&#xff0c;则认为两个四元组重复&#xff09;&#xff1a; …

openssl3.2 - exp - buf to bio

文章目录 openssl3.2 - exp - buf to bio概述笔记bio_get_length调用端代码函数实现bio_to_buffer END openssl3.2 - exp - buf to bio 概述 不想让程序调用openssl API时, 有文件落地的动作. 如果程序有配置文件要用, 也是自己读文件到buffer, 然后转成BIO给openssl的相关有…

通过 saltstack 批量更新 SSL 证书

哈喽大家好&#xff0c;我是咸鱼。 之前写过两篇关于 SSL 过期巡检脚本的文章&#xff1a; SSL 证书过期巡检脚本SSL 证书过期巡检脚本(Python 版) 这两篇文章都是讲如何通过脚本去自动检测 SSL 过期时间的&#xff0c;当我们发现某一域名的 SSL 证书过期之后&#xff0c;就…

opengles 背面剔除介绍(十二)

文章目录 前言一、OpenGL ES 剔除功能简介二、Opengl ES 剔除功能相关的API1.使能剔除功能2. 配置面剔除模式3. 设置剔除面的顺序4. 禁用剔除功能总结参考资料前言 本文主要介绍 opengles3.0 中的背面剔除相关知识,对于绘制3d 图形, 经常会用到它,并且它能提升渲染效率 软硬…

Linux浅学笔记04

目录 Linux实用操作 Linux系统下载软件 yum命令 apt systemctl命令 ln命令 日期和时区 IP地址 主机名 网络传输-下载和网络请求 ping命令 wget命令 curl命令 网络传输-端口 进程 ps 命令 关闭进程命令&#xff1a; 主机状态监控命令 磁盘信息监控&#xff1a…

蓝桥杯 子矩阵 (找大小为a*b的矩阵的最大最小值的乘积,queue)

题目链接 &#xff1a; https://www.lanqiao.cn/problems/3521/learning/?subject_code1&group_code3&match_num14&match_flow1&origincup 思想 &#xff1a; 用堆维护最大值最小值即可 暴力实现 复杂度 N^2 * log(N^2) 代码&#xff1a; #include<bit…