代码编织梦想

题目

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

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/construct-binary-tree-from-inorder-and-postorder-traversal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

代码

这部分我在本题基础上加了遍历方法,可以在编辑器运行,看结果

import java.util.ArrayList;
import java.util.List;

/**
 * @author 周利盘特
 * @version 1.0
 */
public class BuildTree {
    public static void main(String[] args) {
        int[] inOrder = {9, 3, 15, 20, 7};//二叉树中序遍历序列
        int[] postOrder = {9, 15, 7, 20, 3};
        TreeNode treeNode = buildTree(inOrder, postOrder);
        List<Integer> tree = showTree(treeNode, new ArrayList<Integer>());
        System.out.println(tree.toString());
    }

    public static TreeNode buildTree(int[] inorder, int[] postorder) {
        //如果数组为0,返回空
        if (inorder.length == 0) {
            return null;
        }
        //将后续遍历数组的最后一个元素作为根节点
        int value = postorder[postorder.length - 1];
        TreeNode root = new TreeNode(value);
        if (postorder.length == 1) {//若数组只有一个节点,就返回这棵树
            return root;
        }
        //以后续遍历数组的最后一个节点为分割点,
        int despitIndex;
        for (despitIndex = 0; despitIndex < inorder.length; despitIndex++) {
            if (inorder[despitIndex] == root.val) {
                break;
            }
        }
        //分割中序遍历数组,分成左中序数组,右中序数组
        int[] leftInorder = new int[despitIndex];
        for (int i = 0; i < leftInorder.length; i++) {
            leftInorder[i] = inorder[i];
        }
        int[] rightInorder = new int[inorder.length - leftInorder.length - 1];
        for (int i = despitIndex + 1, j = 0; i < inorder.length; i++, j++) {
            rightInorder[j] = inorder[i];
        }
        //分割后序遍历数组之前,将后序遍历数组最后一个元素去掉,因为已经作为根节点了
        int[] tempPost = new int[postorder.length - 1];
        for (int i = 0; i < tempPost.length; i++) {
            tempPost[i] = postorder[i];
        }
        postorder = tempPost;//去掉了最后一个元素
        //分割后续遍历数组,分成左后序数组,右后序数组
        int[] leftPostorder = new int[leftInorder.length];
        for (int i = 0; i < leftInorder.length; i++) {
            leftPostorder[i] = postorder[i];
        }
        int[] rightPostorder = new int[postorder.length - leftPostorder.length];
        for (int i = leftPostorder.length, j = 0; i < postorder.length; i++, j++) {
            rightPostorder[j] = postorder[i];
        }
        root.left = buildTree(leftInorder, leftPostorder);
        root.right = buildTree(rightInorder, rightPostorder);
        return root;
    }

    /**
     * 前序遍历二叉树
     * @param root 二叉树根节点
     * @param list 存放遍历的节点
     * @return     遍历结果
     */
    public static List<Integer> showTree(TreeNode root, List<Integer> list) {
        if (root != null) {
            list.add(root.val);
        }
        if (root.left != null) {
            showTree(root.left, list);
        }
        if (root.right != null) {
            showTree(root.right, list);
        }
        return list;
    }
}

/**
 * 二叉树操作类
 */
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;
    }
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_42373606/article/details/129425489

Java实现 LeetCode 106 从中序与后序遍历序列构造二叉树-爱代码爱编程

106. 从中序与后序遍历序列构造二叉树 根据一棵树的中序遍历与后序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 中序遍历 inorder = [9,3,15,20,7] 后序遍历 postorder = [9,15,7,20,3] 返回如下的二叉树: 3 / \ 9 20 / \ 15

Python从中序与后序遍历序列构造二叉树-爱代码爱编程

  """ 根据一棵树的中序遍历与后序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 中序遍历 inorder = [9,3,15,20,7] 后序遍历 postorder = [9,15,7,20,3] 返回如下的二叉树:     3    / \   9  20     /  \    15   7 作者:力扣 (LeetC

LeetCode 106. 从中序与后序遍历序列构造二叉树 【c++/java详细题解】-爱代码爱编程

目录 1、题目2、思路3、c++代码4、Java代码 1、题目 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 示例 1: 输入:inorder = [9,3,15,20,7], postorder = [

二叉树——从中序与后序遍历序列构造二叉树-爱代码爱编程

从中序与后序遍历序列构造二叉树 题目题目理解代码实现总结 基础首先要掌握二叉树的前序、中序、后续遍历,理解递归在二叉树操作中的重要地位,熟悉分治法在解决实际问题中的广泛应用。 题目 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回

LeedCode 106:从中序与后序遍历序列构造二叉树-爱代码爱编程

从中序与后序遍历序列构造二叉树 题目描述: 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 示例 1:  输入:inorder = [9,3,15,20,7], postorder = [9,15,7,

从中序与后序遍历序列构造二叉树_海螺蜜的博客-爱代码爱编程

106. 从中序与后序遍历序列构造二叉树 示例 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] 思路:后序数组最后一个值是当前的中间

从中序与后序遍历序列构造二叉树(java)_海棠依旧€的博客-爱代码爱编程

根据一棵树的中序遍历与后序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出中序遍历 inorder = [9,3,15,20,7] 后序遍历 postorder = [9,15,7,20,3] 返回如下的二叉树:  思路:以后序数组的最后一个元素为切割点,先切中序数组,根据中序数组,反过来在切后序数组。一层一层切下去,每次后序

代码随想录二叉树——从中序与后序遍历序列构造二叉树_hdu-五七小卡的博客-爱代码爱编程

题目 根据一棵树的中序遍历与后序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 中序遍历 inorder = [9,3,15,20,7] 后序遍历 postorder = [9,15,7,20,

106. 从中序与后序遍历序列构造二叉树_c_x_330的博客-爱代码爱编程

文章目录 题目描述做题思路代码实现题目链接 题目描述 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历

aaai顶会行人重识别算法详解——relation network for person re-identification-爱代码爱编程

1.论文整体框架概述         在行人重识别任务中,通常都是对整个输入数据进行特征提取,但是缺少了局部信息。能不能既考虑局部与整体信息,也同时加入他们的联系呢?这篇论文主要的思想就是局部信息和全局信息的融合。        整体流程如上图所示, 首先对整体进行特征提取, 通常采用图像分类网络(如resnet50)进行特征提取,获得特

[日记]leetcode算法·二十三——单调栈-爱代码爱编程

1 单调栈 单调栈和单调队列作为线性结构,通过保持一定的序列性,从而能很好地适应寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置。单调栈与单调队列的本质都是空间换时间,通过保存可能用到的所有极值,省去了过多的重

c++回顾(十七)—— 类型转换-爱代码爱编程

17.1 static_cast(expr) static_cast强制类型转换 用于基本类型间的转换,但不能用于基本类型指针之间的转换 用于有继承关系类对象之间的转换和类指针之间的转换 static_cast是在编译

java——腐烂的橘子_腐烂的橘子java-爱代码爱编程

题目链接 leetcode在线oj题——腐烂的橘子 题目描述 在给定的 m x n 网格 grid 中,每个单元格可以有以下三个值之一: 值 0 代表空单元格;值 1 代表新鲜橘子;值 2 代表腐烂的橘子。 每分

【改进灰狼优化算法】改进收敛因子和比例权重的灰狼优化算法【期刊论文完美复现】(matlab代码实现)_灰狼 步长因子 非凸优化-爱代码爱编程

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭:行百里者,半于九十。 📋📋📋本文目录如下:🎁🎁🎁 目录 💥1 概述 📚2 运行结果 🎉3 文献来源 🌈4 Matlab代码实现 💥1

【leetcode】剑指 offer(19)-爱代码爱编程

目录 题目:剑指 Offer 36. 二叉搜索树与双向链表 - 力扣(Leetcode) 题目的接口: 解题思路: 代码: 过啦!!! 写在最后: 题目:剑指 Offer 36. 二叉搜索树与双向链表 - 力扣(Leetcode) 题目的接口: /* // Definition for a Node. class Node {