【数据结构与算法】二叉树的遍历及还原

树形结构 - 有向无环图

树是图的一种。

  • 树形结构有一个根节点
  • 树形结构没有回路
  • 根节点:A
  • 叶子节点:下边没有其他节点了
  • 节点:既不是根节点,又不是叶子节点的普通节点
  • 树的度:这棵树最多叉的节点有多少叉,这棵树的度就为多少
  • 树的深度:最深有几层就是几

二叉树:

image.png

  1. 二叉树的根节点A

  2. 子节点:某个节点下面的节点

  3. 父节点:上级节点

  4. 叶子节点:CDE

  5. 节点:B

  6. 满二叉树:(1)所有的叶子节点都在最底层 (2)每个非叶子节点都有两个子节点

  7. 完全二叉树:

    国内定义:(1)叶子节点都在最后一层或倒数第二层(2)叶子节点都向左聚拢

    国际定义:(1)叶子节点都在最后一层或倒数第二层(2)如果有叶子节点,就必然有两个叶子节点

遍历二叉树

  • 前序遍历:根左右
  • 中序遍历:左根右
  • 后序遍历:左右根

image.png

前序遍历

function Node(value) {this.value = valuethis.left = nullthis.right = null
}let a = new Node('a')
let b = new Node('b')
let c = new Node('c')
let d = new Node('d')
let e = new Node('e')
let f = new Node('f')
let g = new Node('g')
a.left = c
a.right = b
c.left = f
c.right = g
b.left = d
b.right = efunction preTraversal(root) {if (root == null) returnconsole.log(root.value)preTraversal(root.left)preTraversal(root.right)
}
preTraversal(a)

中序遍历

function Node(value) {this.value = valuethis.left = nullthis.right = null
}let a = new Node('a')
let b = new Node('b')
let c = new Node('c')
let d = new Node('d')
let e = new Node('e')
let f = new Node('f')
let g = new Node('g')
a.left = c
a.right = b
c.left = f
c.right = g
b.left = d
b.right = efunction inTraversal(root) {if (root == null) returninTraversal(root.left)console.log(root.value)inTraversal(root.right)
}
inTraversal(a)

后序遍历

function Node(value) {this.value = valuethis.left = nullthis.right = null
}let a = new Node('a')
let b = new Node('b')
let c = new Node('c')
let d = new Node('d')
let e = new Node('e')
let f = new Node('f')
let g = new Node('g')
a.left = c
a.right = b
c.left = f
c.right = g
b.left = d
b.right = efunction postTraversal(root) {if (root == null) returnpostTraversal(root.left)postTraversal(root.right)console.log(root.value)
}
postTraversal(a)

还原二叉树

给出前中序还原二叉树

let preTraverse = ['a', 'c', 'f', 'g', 'b', 'd', 'e'];
let inTraverse = ['f', 'c', 'g', 'a', 'd', 'b', 'e'];function Node(value) {this.value = valuethis.left = nullthis.right = null
}function binaryTree(preTraverse, inTraverse) {if (preTraverse == null || inTraverse == null || preTraverse.length == 0 || inTraverse.length == 0 || preTraverse.length != inTraverse.length) returnlet  root = new Node(preTraverse[0])// 找到根节点在中序遍历中的位置let index = inTraverse.indexOf(root.value)// 先序序遍的左子树let preLeft = preTraverse.slice(1, 1 + index)// 先序遍历的右子树let preRight = preTraverse.slice(1 + index, preTraverse.length)// 中序遍历的左子树let inLeft = inTraverse.slice(0, index)// 中序遍历的右子树let inRight = inTraverse.slice(index + 1, inTraverse.length)root.left = binaryTree(preLeft, inLeft)root.right = binaryTree(preRight, inRight)return root
}let root = binaryTree(preTraverse, inTraverse)
console.log(root.left)
console.log(root.right)

image.png

给出中后序还原二叉树

let postTraverse = ['f', 'g', 'c', 'd', 'e', 'b', 'a'];
let inTraverse = ['f', 'c', 'g', 'a', 'd', 'b', 'e'];function Node(value) {this.value = valuethis.left = nullthis.right = null
}function binaryTree(postTraverse, inTraverse) {if (postTraverse == null || inTraverse == null || postTraverse.length == 0 || inTraverse.length == 0 || postTraverse.length != inTraverse.length) returnlet  root = new Node(postTraverse[postTraverse.length - 1])// 找到根节点在中序遍历中的位置let index = inTraverse.indexOf(root.value)// 后序序遍的左子树let postLeft = postTraverse.slice(0, index)// 后序遍历的右子树let postRight = inTraverse.slice(index, postTraverse.length - 1)// 中序遍历的左子树let inLeft = inTraverse.slice(0, index)// 中序遍历的右子树let inRight = inTraverse.slice(index + 1, inTraverse.length)root.left = binaryTree(postLeft, inLeft)root.right = binaryTree(postRight, inRight)return root
}let root = binaryTree(postTraverse, inTraverse)
console.log(root.left)
console.log(root.right)

image.png

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

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

相关文章

实例、构造函数、原型、原型对象、prototype、__proto__、原型链……

学习原型链和原型对象,不需要说太多话,只需要给你看看几张图,你自然就懂了。 prototype 表示原型对象__proto__ 表示原型 实例、构造函数和原型对象 以 error 举例 图中的 error 表示 axios 抛出的一个错误对象(实例&#xff0…

WiFiSpoof for Mac wifi地址修改工具

WiFiSpoof for Mac,一款专为Mac用户打造的网络隐私守护神器,让您在畅游互联网的同时,轻松保护个人信息安全。 软件下载:WiFiSpoof for Mac下载 在这个信息爆炸的时代,网络安全问题日益凸显。WiFiSpoof通过伪装MAC地址&…

C++入门知识详细讲解

C入门知识详细讲解 1. C简介1.1 什么是C1.2 C的发展史1.3. C的重要性1.3.1 语言的使用广泛度1.3.2 在工作领域 2. C基本语法知识2.1. C关键字(C98)2.2. 命名空间2.2 命名空间使用2.2 命名空间使用 2.3. C输入&输出2.4. 缺省参数2.4.1 缺省参数概念2.4.2 缺省参数分类 2.5. …

GRE和MGRE综合实验

实际网段划分 分配IP 1.IP划分 [r1]int g0/0/0 [r1-GigabitEthernet0/0/0]ip add 192.168.1.254 24 Mar 29 2024 16:42:44-08:00 r1 %%01IFNET/4/LINK_STATE(l)[3]:The line protocol IP on the interface GigabitEthernet0/0/0 has entered the UP state. [r1-Gigabi…

飞天使-k8s知识点28-kubernetes散装知识点5-helm安装ingress

文章目录 安装helm添加仓库下载包配置创建命名空间安装 安装helm https://get.helm.sh/helm-v3.2.3-linux-amd64.tar.gztar -xf helm-v3.2.3-linux-amd64.tar.gzcd linux-amd64mv helm /usr/local/bin修改/etc/profile 文件,修改里面内容,然后重新启用export PATH$P…

动态规划-----背包类问题(0-1背包与完全背包)详解

目录 什么是背包问题? 动态规划问题的一般解决办法: 0-1背包问题: 0 - 1背包类问题 分割等和子集: 完全背包问题: 完全背包类问题 零钱兑换II: 什么是背包问题? 背包问题(Knapsack problem)是一种…

Windows-安装infercnv包(自备)

目录 安装基础 ①安装JAGS a,找到适配版本 b,install for me only安装路径 ②安装"rjags"包 ③安装inferCNV 安装基础 版本: R version 4.2.2 (2022-10-31 ucrt) -- "Innocent and Trusting"安装的JAGS版本为JAGS 4.3.1 首…

GPT提示词分享 —— 智能域名生成器

提示词👇 我希望你能充当一个聪明的域名生成器。我将告诉你我的公司或想法是什么,你将根据我的提示回复我一份域名备选清单。你只需回复域名列表,而不是其他。域名应该是最多 7-8 个字母,应该简短但独特,可以是朗朗上口…

C易错注意之分支循环,悬空else,短路表达式,函数static

接下来的日子会顺顺利利,万事胜意,生活明朗-----------林辞忧 前言: c语言中一些关于分支循环中continue常混淆,悬空esle问题,短路表达式,static ,extern在使用时稍不注意就会出错的点,接下来我们将介绍…

Monkey工具之fastbot-iOS实践

Monkey工具之fastbot-iOS实践 背景 目前移动端App上线后 crash 率比较高, 尤其在iOS端。我们需要一款Monkey工具测试App的稳定性,更早的发现crash问题并修复。 去年移动开发者大会上有参加 fastbot 的分享,所以很自然的就想到Fastbot工具。…

Lilishop商城(windows)本地部署【docker版】

Lilishop商城(windows)本地部署【docker版】 部署官方文档:LILISHOP-开发者中心 https://gitee.com/beijing_hongye_huicheng/lilishop 本地安装docker https://docs.pickmall.cn/deploy/win/deploy.html 命令端页面 启动后docker界面 注…

java回溯算法笔记

回溯算法综述 回溯用于解决你层for循环嵌套问题,且不剪枝的回溯完全等于暴力搜索。 回溯算法模板https://blog.csdn.net/m0_73065928/article/details/137062099?spm1001.2014.3001.5501 组合问题(startindex避免使用重复元素) “不含重复…

一篇讲明白 Hadoop 生态的三大部件

文章目录 每日一句正能量前言01 HDFS02 Yarn03 Hive04 HBase05 Spark及Spark Streaming关于作者推荐理由后记赠书活动 每日一句正能量 黎明时怀着飞扬的心醒来,致谢爱的又一天,正午时沉醉于爱的狂喜中休憩,黄昏时带着感恩归家,然后…

Redis持久化 RDB AOF

前言 redis的十大类型终于告一段落了,下面我们开始redis持久化新篇章 为啥需要持久化呢? 我们知道redis是挡在mysql前面的带刀侍卫 是在内存中的,假如我们的redis宕机了,难道数据直接冲入mysql??? 这显然是不可能的,mysql肯定扛不住这样的场景,所以我们有了redis持久化策略…

Linux 进程信号:产生信号

目录 一、通过终端按键产生信号 1、signal()函数 2、核心转储 3、ulmit命令 二、调用系统函数向进程发信号 1、kill()函数 2、raise()函数 3、abort()函数 三、发送信号的过程 读端关闭、写端继续写入的情况 如何理解软件条件给进程发送信号: 四、软件条件产生信…

【PythonGIS】Python实现批量导出面矢量要素(单个多面矢量->多个单面矢量)

可怜的我周六还在工作,已经很久没更新过博客了,今天正好有空就和大家分享一下。今天给大家带来的是使用Python将包含多个面要素/线要素的矢量批量导出单个要素的矢量,即一个要素一个矢量文件。之前写过多个矢量文件合并成一个矢量文件的博文&…

(一)kafka实战——kafka源码编译启动

前言 本节内容是关于kafka消息中间键的源码编译,并通过idea工具实现kafka服务器的启动,使用的kafka源码版本是3.6.1,由于kafka源码是通过gradle编译的,以及服务器是通过scala语言实现,我们要预先安装好gradle编译工具…

HarmonyOS像素转换-如何使用像素单位设置组件的尺寸。

1 卡片介绍 基于像素单位,展示了像素单位的基本知识与像素转换API的使用。 2 标题 像素转换(ArkTS) 3 介绍 本篇Codelab介绍像素单位的基本知识与像素单位转换API的使用。通过像素转换案例,向开发者讲解了如何使用像素单位设…

【系统架构师】-第13章-层次式架构设计

层次式体系结构设计是将系统组成一个层次结构,每一层 为上层服务 ,并作为下层客户。 在一些层次系统中,除了一些精心挑选的输出函数外, 内部的层接口只对相邻的层可见 。 连接件通过决定层间如何交互的协议来定义,拓扑…

视频声音生成字幕 pr生成视频字幕 以及字幕乱码的解决

目录 目录 1、首先把要生成字幕的视频拖入以创建序列 2、点击工具栏的 窗口 选择 文本 3、选择字幕下的 转录序列 4、选择输出的语言(主要看视频声音说的是啥语言) 5、音轨 选择 音频1​编辑 6、点击转录 7、等待转录文本 8、点击创建说明性字幕按…