首页 > 其他分享 >代码随想录Day28

代码随想录Day28

时间:2022-11-22 20:12:31浏览次数:64  
标签:遍历 Day28 后序 int 代码 随想录 inorder 中序 postorder

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

根据一棵树的中序遍历与后序遍历构造二叉树。

注意: 你可以假设树中没有重复的元素。

例如,给出

中序遍历 inorder = [9,3,15,20,7] 后序遍历 postorder = [9,15,7,20,3] 返回如下的二叉树:

 

 思路:

首先,要确保树中没有重复元素的情况下进行。

后续是左右中,所以根节点一定是最后一个,通过明确的根节点去中序数组中进行切割左右子树位置。

不断递归这个过程即可找出一个唯一的树顺序。

1.判断后序遍历数组的是否为空,如果为空,直接返回。说明数组没有值,数组不存在。

2.找到后序数组的最后一个元素,作为根节点元素。

3.中序数组找到对应位置进行切割操作

4.切割中序数组。

5.根据中序数组切割后序数组

6.递归处理左右区间

 

class Solution {
    Map<Integer, Integer> map;  // 方便根据数值查找位置
    public TreeNode buildTree(int[] inorder, int[] postorder) {
        map = new HashMap<>();
        for (int i = 0; i < inorder.length; i++) { // 用map保存中序序列的数值对应位置
            map.put(inorder[i], i);
        }

        return findNode(inorder,  0, inorder.length, postorder,0, postorder.length);  // 前闭后开
    }
    
    public TreeNode findNode(int[] inorder, int inBegin, int inEnd, int[] postorder, int postBegin, int postEnd) {
        // 参数里的范围都是前闭后开
        if (inBegin >= inEnd || postBegin >= postEnd) {  // 不满足左闭右开,说明没有元素,返回空树
            return null;
        }
        int rootIndex = map.get(postorder[postEnd - 1]);  // 找到后序遍历的最后一个元素在中序遍历中的位置
        TreeNode root = new TreeNode(inorder[rootIndex]);  // 构造结点
        int lenOfLeft = rootIndex - inBegin;  // 保存中序左子树个数,用来确定后序数列的个数
        root.left = findNode(inorder, inBegin, rootIndex,
                            postorder, postBegin, postBegin + lenOfLeft);
        root.right = findNode(inorder, rootIndex + 1, inEnd,
                            postorder, postBegin + lenOfLeft, postEnd - 1);

        return root;
    }
}

 

标签:遍历,Day28,后序,int,代码,随想录,inorder,中序,postorder
From: https://www.cnblogs.com/dwj-ngu/p/16916316.html

相关文章

  • 使用modelsim仿真含Xilinx原语代码块
    很早之前笔者已经写过关于modelsim仿真的文章了,不过之前笔者做的仿真都是有现成代码块的仿真。对于那些使用原语的代码块进行仿真时则需要产生相关的仿真库,笔者这里使......
  • 基础代码-最小值维护
    问题A:最小值维护时间限制:1Sec  内存限制:128MB题目描述设计一个数据结构,支持以下两种操作:1.插入一个数2.输出并删除其中最......
  • 基础代码-维护图的连通性
    问题D:维护图的连通性时间限制:1Sec  内存限制:128MB题目描述给定一个无向图G,写一个程序处理以下两种操作:1.删去一条边(u,v)......
  • 基础代码-维护集合
    问题C:维护集合时间限制:1Sec  内存限制:512MB题目描述维护一个字符串集合:初始为空,依次处理一些插入操作,并在插入之后输出该字符串在集合中出现的次数。......
  • 基础代码-计算后缀表达式
    问题E:计算后缀表达式时间限制:1Sec  内存限制:128MB题目描述后缀表达式是将运算符置于两个运算对象之后的一种表达方法,例如“3+4”用写成后缀表达式后就......
  • 基础代码-线段
    问题B:线段时间限制:1Sec  内存限制:128MB题目描述1.询问+LR增加一条线段[L,R],你的程序应该输出有多少条线段被该线段包含(非严格)。2.询问-L......
  • javascript-代码随想录训练营day6
    242.有效的字母异位词题目链接:https://leetcode.cn/problems/valid-anagram/题目描述:给定两个字符串s和t,编写一个函数来判断t是否是s的字母异位词。注意:若s......
  • 使用MSIL采用Emit方式实现C#的代码生成与注入常用代码
    本文主要使用微软提供的一套C#的API函数,通过这些API函数,可以对已经编译过的.Net体系生成的EXE,DLL文件进行修改,而不是修改源码编译的方式,来完成新功能的加入、或者原有功......
  • ECharts – 饼状图图代码实例及其注释详解
    mytextStyle={color:"#333",//文字颜色fontStyle:"normal",//italic斜体oblique倾斜fontWeight:"normal",//文字粗细boldbolderl......
  • ECharts – 折线图代码实例及注释
    mytextStyle={color:"#333",//文字颜色fontStyle:"normal",//italic斜体oblique倾斜fontWeight:"normal",//文字粗细boldbolderl......