[数据结构]树和二叉树

概念

树是一种 非线性 的数据结构,它是由 n ( n>=0 )个有限结点组成一个具有层次关系的集合。
树形结构中,子树之间不能有交集,否则就不是树形结构
双亲结点或父结点 :若一个结点含有子结点,则这个结点称为其子结点的父结点;
非终端结点或分支结点度不为0的结点

一棵二叉树是结点的一个有限集合,该集合:

  1. 或者为空
  1. 或者是由 一个根节 点加上两棵别称为 左子树右子树的二叉树组成。二叉树是有序树。(递归式)
  2. 满二叉树 : 一棵二叉树,如果 每层的结点数都达到最大值,则这棵二叉树就是满二叉树 。也就是说, 如果一棵 二叉树的层数为 K ,且结点总数是 2的k次方-1 ,则它就是满二叉树
  3. 完全二叉树 : 对于深度为 K 的,有 n 个结点的二叉树,当且仅当其每一个结点都与深度为K 的满二叉树中编号从 0 至 n-1 的结点一一对应时称之为完全二叉树。 要注意的是满二叉树是一种特殊的完全二叉树。
    最大深度: 即每次只有一个节点,次数二叉树的高度为n,为最高的高度
    广度优先需要把下一步所有可能的位置全部遍历完,才会进行更深层次的遍历, 层序遍历就是一种广度优先遍历

深度优先是先遍历完一条完整的路径(从根到叶子的完整路径),才会向上层折返,再去遍历下一个路径,前序遍历就是一种深度优先遍历

最大深度: 即每次只有一个节点,次数二叉树的高度为n,为最高的高度

最小深度: 此树为完全二叉树, 如果是完全二叉树

根据二叉树性质,完全二叉树的高低为 h = log(n+1)向上取整

已知某二叉树的中序遍历序列为JGDHKBAELIMCF,后序遍历序列为JGKHDBLMIEFCA,则其前序遍历序列为(.ABDGJHKCEILMF )

由后序遍历确定子树的根,后序遍历从后向前看,最后一个元素为根,和前序遍历刚好相反,从后向前看后序遍历,应该是根,右,左,根据中序遍历确定子树的左右区间

二叉树的性质

  1. 若规定 根结点的层数为 1 ,则一棵 非空二叉树的第 i 层上最多有 2的(i-1)次方 (i>0) 个结点
  2. 若规定只有 根结点的二叉树的深度为 1 ,则 深度为 K 的二叉树的最大结点数是 2的K次方-1
    (k>=0)
  3. 对任何一棵二叉树 , 如果其 叶结点个数为 n0, 度为 2 的非叶结点个数为 n2, 则有 n0=n2+1
  4. 具有 n 个结点的完全二叉树的 深度k为log2(n+1)上取整
  1. 对于具有 n 个结点的完全二叉树 ,如果按照 从上至下从左至右的顺序对所有节点从 0 开始编号 ,则对于 序号为 i 的结点有
    若 i>0 , 双亲序号: (i-1)/2i=0 i 为根结点编号 ,无双亲结点
    2i+1<n ,左孩子序号: 2i+1 ,否则无左孩子
    2i+1<n ,左孩子序号: 2i+2 ,否则无右孩子

二叉树的存储

二叉树的存储结构 分为: 顺序存储(堆)类似于链表的链式存储
叉树的链式存储是通过 一个一个的节点引用起来的 ,常见的表示方式有二叉和三叉表示方式

复制代码
// 孩子表示法
class Node {
int val; // 数据域
Node left; // 左孩子的引用,常常代表左孩子为根的整棵左子树
Node right; // 右孩子的引用,常常代表右孩子为根的整棵右子树
}

二叉树的遍历

前中后序遍历

N 代表根节点, L 代表根节点的左子树,R 代表根节点的右子树,则根据遍历根节点的先后次序有以下遍历方式:
NLR :前序遍历 (Preorder )------ 访问根结点 ---> 根的左子树 ---> 根的右子树。
LNR :中序遍历 (Inorder )------ 根的左子树 ---> 根节点 ---> 根的右子树。
LRN :后序遍历 (Postorder ------ 根的左子树 ---> 根的右子树 ---> 根节点。
前序+中序-- 确定根节点 后序+中序--确定根节点
以先序遍历为例:(本质还是递归)

前序遍历结果: 1 2 3 4 5 6
中序遍历结果: 3 2 1 5 4 6
后序遍历结果: 3 2 5 6 4 1

层序遍历

层序遍历就是从所在二叉树的根节点出发,首先访问第一层的树根节点,然后从左到右访问第 2 层
上的节点,接着是第三层的节点,以此类推, 自上而下,自左至右逐层访问树的结点的过程 就是层序遍历。

相关推荐
mldong5 小时前
引擎从不发一条消息:jeeflow 的两类扩展点与消息模块的分工
java·架构
君顾16 小时前
智慧零售实战指南:从技术架构到落地方案全解析
java·开发语言·零售
zhanghe6876 小时前
es的密码带有特殊字符,导出
java
pnoker6 小时前
IoT DC3 概念解读:把设备抽象成一套语义模板——位号、指令、事件与面向智能体的设备建模
java·人工智能·物联网·iot·dc3
my_realmy6 小时前
Java SE 基础学习笔记(一):面向对象、继承多态、抽象接口与异常(JDK 8)
java·多线程·并发··生产者消费者模式
天远数科7 小时前
风险治理实战:基于天远车信盟出险构建自动化理赔核保流水线
java·网络·人工智能·自动化
骇客野人7 小时前
SpringBoot电商系统用户注册、登录、留存及数据埋点设计与落地实施方案
java·spring boot·后端
qiuhaipeng18 小时前
Claude code 升级后上下文长度变短问题
java·前端·数据库
wxwx_bscxy3228 小时前
基于Python新冠疫情可视化分析系统的设计与实现
java·数据库·spring boot·python·微信小程序·sqlite
evans在进步9 小时前
Tomcat NIO 工作原理详解:从 Acceptor、Poller 到容器处理链
java·tomcat·nio