[数据结构]树和二叉树

概念

树是一种 非线性 的数据结构,它是由 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 层
上的节点,接着是第三层的节点,以此类推, 自上而下,自左至右逐层访问树的结点的过程 就是层序遍历。

相关推荐
一定要AK5 分钟前
萌新赛练习
数据结构
RainbowSea9 分钟前
补充:问题:CORS ,前后端访问跨域问题
java·spring boot·spring
RainbowSea11 分钟前
15. MySQL 多版本并发控制
java·sql·mysql
倔强的石头10619 分钟前
飞算JavaAI:重构软件开发范式的智能引擎
java·数据库·重构
Q_9709563935 分钟前
java+vue+SpringBoo足球社区管理系统(程序+数据库+报告+部署教程+答辩指导)
java·开发语言·数据库
要开心吖ZSH40 分钟前
微服务架构的演进:迈向云原生
java·微服务·云原生
为了更好的明天而战1 小时前
Java 中的 ArrayList 和 LinkedList 区别详解(源码级理解)
java·开发语言
JosieBook1 小时前
【Java编程动手学】Java中的数组与集合
java·开发语言·python
N_NAN_N2 小时前
类图+案例+代码详解:软件设计模式----单例模式
java·单例模式·设计模式
weixin_399380692 小时前
k8s一键部署tongweb企业版7049m6(by why+lqw)
java·linux·运维·服务器·云原生·容器·kubernetes