第四日

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

题目描述:给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。
示例

输入: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
输出: [3,9,20,null,null,15,7]
初见想法

  1. 不懂如何构建树
  2. 不知道前序和中序还原树的规则
  3. 即使知道规则也不知道如何用于构建树
    GPT代码
class TreeNode:def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = rightdef buildTree(preorder, inorder):if not preorder or not inorder:return Noneroot_val = preorder[0]root = TreeNode(root_val)root_index = inorder.index(root_val)root.left = buildTree(preorder[1:root_index+1], inorder[:root_index])root.right = buildTree(preorder[root_index+1:], inorder[root_index+1:])return root# 示例输入
preorder = [3, 9, 20, 15, 7]
inorder = [9, 3, 15, 20, 7]# 构建二叉树
root = buildTree(preorder, inorder)# 遍历二叉树
def postorder_traversal(node):if node:postorder_traversal(node.left)postorder_traversal(node.right)print(node.val)postorder_traversal(root)

思路理解

  1. 首先,建树就是要定义一个有值,左右指针的对象
  2. 由于是递归地构建树,所以要有终止条件,也就是当可供构建的序列其中一个为空时就停止构建,返回空
    而且,两个序列一定同时为空或不为空,因为这两个序列分别代表以该节点为根节点的树的前中序遍历。
  3. 所谓前中后序遍历,实际上指的是根节点被遍历的次序,描述的就是左右两个孩子中间插入一个父节点,这时候有三个空位,插在哪个就是对应的遍历。
    所以,通过前序遍历的第一个元素,我们可以确定这两个序列所对应的根节点,进而可以在中序遍历中找到根节点的位置,这样又可以分出左右两棵子树。
    这时的关键就在于如何确定两棵子树拥有的前中序遍历,这就要涉及到一个关键的变量——根节点的位置,因为这涉及到左右子树拥有的元素。
    如上图所示,前序遍历是根-左-右,中序遍历是左-根-右,所以在中序遍历中找到根节点的位置后,就可以根据其位置,获取前序和中序遍历的子树数组,因为遍历是递归的,所以在原有树下的遍历顺序在子树下也一样。
  4. 整个过程都在利用到建构树的对象。
  5. 递归函数的返回就是根节点。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/722064.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python_编程基础

Python_编程基础 Python编程基础 0、简单介绍 解释型语言:一边编译一边运行,不需要进行编译,运行效率比较低 解释器 JavaScript-浏览器 python.exe php.exe 编译型语言:运行前需要进行编译,运行效率比较高 C .c->.exe 组合:anaconda+pycharm、python+pychar…

答题判题程序终版与家居强电电路模拟程序两次迭代

目录: 一)前言 二)设计与分析 三)踩坑心得 四)改进建议 五)总结 一.前言 (1)答题判题程序-4: 【1】知识点:正则表达式,判题的逻辑思维能力,数据形式转换。 【2】题量:很大 【3】难度:很难 是前三次答题判题程序迭代优化的最终形态,难度较高,它对于类的种类的个…

AX6000 Zerotier 开机自启 持久化虚拟 MAC 地址

步骤:当前先配置好 Zerotier,保证可以拿到 IP 地址;将整个 Zerotier 复制到 /data 下;cp -a /var/lib/zerotier-one /data/zerotier删掉 /data/zerotier/ 下的 zerotier-one.pid 文件 在 /data/auto_ssh/auto_ssh.sh 末尾添加如下内容:cp -a /data/zerotier /var/lib/zero…

Java第二次Blog

7-4~6题目集 前言 这些题目主要用到对象与类的处理继承与多态的使用: 继承和多态是面向对象编程中相互关联的两个概念。继承为多态提供了基础,而多态则通过继承实现了代码的灵活性和可扩展性。 1.字符串处理:需要对输入的题目信息和答题信息进行字符串分割、提取和处理,以获…

D - 88888888

D - 88888888 https://atcoder.jp/contests/abc357/tasks/abc357_d思路 Code https://atcoder.jp/contests/abc357/submissions/54384091LL n;LL base = 998244353;LL getlen(LL n){LL cnt = 0;while(n){cnt++;n /= 10;}return cnt; }LL ksm(LL a, LL b) {LL t = 1;while (b){…

Git底层原理与分析模型

https://www.cnblogs.com/liqinglucky/p/git.html 一、git版本管理 1.1 背景--从写毕业论文讲文档备份 让我们从写毕业论文的经历讲起。通常开始写论文之前,先在一个开阔的空间创建了一个文件夹用于保存将来的论文稿。然后就开始了我们的 “毕业论文版本管理”。这样管理存在的…

SpringBoot配置文件敏感信息加密方案

在SpringBoot Project中,会将一些敏感信息配置到application.yml/application.properties配置文件中(同样适用于Spring Cloud的各个微服务其实(微服务实例)本质就是一个SpringBoot),例如数据库的用户名和密码、Redis的密码等。为了保证敏感信息的安全,我们需要将此类数据…

pythontqdm实现git进度条效果

注意1:这里是在python3环境下使用的git,安装要使用 pip install Gitpython 来安装在python环境下的git 注意2:这个方法可适用于 windows 环境和 Linux 环境import git import tqdmrepo_url = https://gitee.com/alichinese/oebuild-bin.git local_path = F:\\test\\oebuild-…

重生之我在男航学Java-2

一、前言答题判题程序-4 新增内容:选择题,填空题,输出顺序的变化,考虑多个同学有多张不同试卷的答卷的情况 新增知识点:抽象类的运用; 在设计好前三次的题目集的情况下,将原本的题目类设计为抽象类(本来在第一次题目集的时候就可以如此设计,但是当时学的不够多),同时…

PTA三次作业总结(2)

前言 这三次PTA难度不一,题目集四的题目是在之前的基础上迭代的,因为已经经过了几次的迭代,题目的难度较大,五、六则是新题目,以及在新题目上的迭代,五难度还好,六难度稍微大一点。 设计与分析 4-7-1(题目) 设计实现答题程序,模拟一个小型的测试,要求输入题目信息、…

解决系统too many open files

.背景nofile不足引起的too many open files故障报警频繁出现2.文件描述符的定义与功能文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件…