[数据结构]树和二叉树

概念

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

相关推荐
Java致死2 小时前
设计模式Java
java·开发语言·设计模式
源码方舟2 小时前
SpringBoot + Shiro + JWT 实现认证与授权完整方案实现
java·spring boot·后端
新时代丘鸣山3 小时前
idea Maven 打包SpringBoot可执行的jar包
maven·intellij-idea·jar
2401_cf5 小时前
为什么hadoop不用Java的序列化?
java·hadoop·eclipse
帮帮志5 小时前
idea整合maven环境配置
java·maven·intellij-idea
LuckyTHP5 小时前
java 使用zxing生成条形码(可自定义文字位置、边框样式)
java·开发语言·python
无声旅者8 小时前
深度解析 IDEA 集成 Continue 插件:提升开发效率的全流程指南
java·ide·ai·intellij-idea·ai编程·continue·openapi
Ryan-Joee8 小时前
Spring Boot三层架构设计模式
java·spring boot
Hygge-star8 小时前
【数据结构】二分查找5.12
java·数据结构·程序人生·算法·学习方法
dkmilk9 小时前
Tomcat发布websocket
java·websocket·tomcat