【嵌入式修炼:数据结构篇】——树和二叉树

一、树的基本概念

1.定义:

树是n(n > = 0)个结点的有限集合

n = 0时:称为空树。

n > 0时,满足:

  • 有且仅有一个根结点(root)
  • 其余结点可分为m(m>0)个互不相交的有限集合,每个集合本身也是一棵树,称为根的子树

2.结点的分类:

1)结点:树中的一个独立单元,包含一个数据元素,及若干指向其子树的分支

2)度(结点的):子树的个数

3)树的度:结点中最大的度

4)叶子节点(终端节点):度为0的节点

5)分支节点(内部节点或非终端节点):度不为0

3.节点之间的关系:

1)双亲和孩子:结点的子树称为该节结的孩子,该结点也称为孩子的双亲

2)兄弟:同一个双亲的孩子之间互称兄弟;双亲在同一层的孩子称为堂兄弟

3)祖先和子孙:结点的祖先是从根到该结点所经分支上的所有结点,以某结点为根的子树中的任一结点称为该结点的子孙

4.度量树:

树的深度:树中的结点的最大层次;

树的高度;两者之间数值相同

5.有序树和无序树

如果将树中的结点的各子树看成从左至右是有次序的,不能互换的,则称该树为有序的,否则称为无序树。

6.森林:

森林是m ( m >= 0 ) 棵互不相交的树的集合

7.线性结构和树结构的区别:

|----------------|---------------|
| 线性结构 | 树结构 |
| 第一个数据元素:无前驱 | 根结点:无双亲,唯一 |
| 最后一个数据元素:无后继 | 叶结点:无孩子,可以多个 |
| 中间元素:一个前驱,一个后继 | 中间结点:一个双亲多个孩子 |


二、树的存储结构

1.顺序存储:

适用于完全二叉树等结构规则的树,常用数组实现

2.链式存储:

通用方式:每个节点包含数据域和指向子节点的指针域


三、二叉树

1.定义:

是n(n≥0)个结点的有限集合,或为空树(n=0);或由一个根结点和两棵互不相交的子树组成,分别称为左子树和右子树,且二者有严格顺序。

2.特点:

1)每个结点最多有两个子树,所有二叉树中不存在度大于2的结点;

2)左、右子树有顺序,不可互换;

3)即使某结点仅有一个子树,也必须明确是左子树还是右子树。

3.二叉树的五种基本形态:

1)空二叉树

2)只有一个根结点

3)根结点只有左子树

4)根结点只有右子树

5)根结点既有左子树又有右子树

4.特殊二叉树:

1)斜树:所有的结点都只有左子树的二叉树叫左斜二叉树,所有结点都只有右子树的二叉树叫右斜树,这两种情况统称斜树。

2)满二叉树:在一棵二叉树中,如果所有的分支结点都存在左子树和右子树,并且所有的叶子都在同一层,这样的二叉树称为满二叉树。(深度为k且结点树为(2^k) - 1的二叉树,在同等深度的二叉树中,满二叉树的结点个数最多,叶子树最多)

3)完全二叉树:对n个结点按层序从1到n编号,若每个结点的位置与相同深度的满二叉树中编号相同的结点位置一致,则为完全二叉树。

  • 完全二叉树的特点:除最后一层外,其它层全满,最后一层的结点靠左排列
  • 满二叉树一定是完全二叉树,完全二叉树不一定是满二叉树
  • 按层序编号就是设想每一个结点都有左右子树,都编号,如下图,就是5没有左子树,但是还是会给他的左子树编10,尽管他为空,右子树编11
  • 叶子结点只能出现在最下两层
  • 最下层的叶子一定集中在左边连续的位置
  • 倒数第二层若有叶子结点,一定在右边连续的位置
  • 如果结点度为1,则该结点只有左孩子
  • 同样结点树的二叉树,完全二叉树的深度最小

5.二叉树的性质

1)在二叉树的第i层最多有2^(i-1)个结点(i>=1)

2)深度为k的二叉树最多有(2^k)-1个结点

3)对于任何一棵二叉树,如果其终端结点树为m,度为2的结点数为n,则m = n + 1

4)具有n个结点的完全二叉树的深度为log2 n」+1(对数是以2为底,\[x表示不大于x的最大整数)

5)如果对一棵有n个结点的完全二叉树(其深度为log2 n+1)的结点按层序编号(从第1层到第[log2n」+1层,每层从左到右),对任一结点i(1≤i≤n)有:

  • 如果 i =1,则结点/是二叉树的根,无双亲;

  • 如果i >1,则其双亲是结点i / 2

  • 如果2i > n,则结点/无左孩子(结点/为叶子结点);否则其左孩子是结点2i

  • 如果2i+1>n,则结点/无右孩子;否则其右孩子是结点2i+1。


    四、二叉树的遍历

从根结点出发,按照某种次序依次访问二叉树中的所有结点,使得每个结点被访问一次且仅被访问一次

1.前序遍历:

规则:若二叉树为空,则空操作返回,否则先访问根结点,然后前序遍历左子树,再前序遍历右子树。如下图,遍历的顺序为 ABDGHCEIF

2.中序遍历:

规则:若二叉树为空,则空操作返回,否则从根结点开始(注意并不是先访问根结点),中序遍历根结点的左子树,然后访问根结点,最后中序遍历右子树。如下图,遍历的顺序为

3.后序遍历:

4.层序遍历:

相关推荐
CSharp精选营2 天前
关系型 vs 非关系型:从原理到选型,一文搞定数据库核心分类
数据结构·nosql·关系型数据库·非关系型数据库·技术选型
刘马想放假5 天前
Modbus 全栈技术解析:TCP、RTU、ASCII、RTU over TCP
数据结构·网络协议
北域码匠6 天前
冒泡排序太慢?鸡尾酒排序双向优化,原生 C# 零第三方库完整代码
数据结构·排序算法·泛型·c# 算法·鸡尾酒排序·原生 c# 开发·冒泡排序优化·嵌入式算法
Darling噜啦啦13 天前
列表转树算法深度解析:从 Map 到 Reduce 的两种实现,面试高频考点
数据结构·算法·面试
小小工匠14 天前
Redis - 事务机制:能实现 ACID 属性吗
数据结构·redis·性能优化·并发·持久化
玖玥拾14 天前
C/C++ 数据结构(七)栈、容器适配器
c语言·数据结构·c++··容器适配器
Qres82114 天前
算法复键——树状数组
数据结构·算法
牛油果子哥q14 天前
并查集(DSU)超精讲,路径压缩、按秩合并、万能模板、连通性判定、最小生成树与刷题实战全解
数据结构·c++·最小生成树·并查集
凌波粒14 天前
LeetCode--491.递增子序列(回溯算法)
数据结构·算法·leetcode
WL学习笔记14 天前
单项不带头不循环链表
数据结构·链表