详解二叉树的存储王道版(C++/C)

简介: 目录一、树是什么? 1.树的概念2.结点的分类3.树的其他相关概念 4.数的存储结构5、树的常考性质二、二叉树1.如何引入二叉树 2.相互转换 (1)树转换二叉树(2)二叉树还原为树​​​​​​​(3) 森林转化为二叉树3.二叉树概念4.二叉树的五种状态5.几种特殊的二叉树6.二叉树的性质7.完全二叉树的常考性质8.二叉树的存储

目录


一、树是什么?


1.树的概念


2.结点的分类


3.树的其他相关概念


4.数的存储结构


5、树的常考性质


二、二叉树


1.如何引入二叉树


2.相互转换


(1)树转换二叉树


(2)二叉树还原为树


(3) 森林转化为二叉树


3.二叉树概念


4.二叉树的五种状态


5.几种特殊的二叉树


6.二叉树的性质


7.完全二叉树的常考性质


8.二叉树的存储


一、树是什么?

1.树的概念

树(Tree)是n(n≥0)个结点的有限集合,当n=0时,为空树;n>0时,为非空树。任意一棵非空树,满足:      


(1)有且仅有一个称之为根的结点;      


(2)除根结点以外的其余结点可分为m(m>0)个互不相交的有限集T1, T2, …, Tm, 其中每一个集合本身又是一棵树,并且称为根的子树(SubTree)。

image.png

2.结点的分类

关于树的结点涉及许多概念需要我们了解


结点——结点包含数据元素及若干指向子树的分支信息。


结点的度——结点拥有的子树个数。


树的度——树中结点的最大度数。


终端结点——度为0的结点,又称叶子。


分支结点——度大于0的结点,除了叶子都是分支结点。


内部结点——除了树根和叶子都是内部结点。


属性


结点的层次(深度)-- 从上往下数(默认从1开始)


结点的高度--从下往上数


数的高度 (深度)--  总共多少层


结点的度 -- 有几个孩子(分支)


树的度——各结点的度的最大值


image.png3.树的其他相关概念

路径——树中的俩个结点之间的所经过的结点序列。


路径长度——俩接结点之间路径所经过的边数。


双亲、孩子——结点的子树的根称为该结点的孩子。


兄弟——双亲相同的结点互称兄弟。


堂兄弟——双亲是兄弟的结点互称兄弟。


祖先——即从该结点到数根经过的所有结点,称为该结点的祖先。


子孙——结点的子树中的所有结点都称为该节点的子孙。


有序树——逻辑上看,树中结点的各子树从左至右是有次序的,不能互换。


无序树——逻辑上看,树中结点的各子树从左至右是无次序的,可以互换。



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


4.数的存储结构

 1.双亲表示法


 2.孩子表示法


 3.双亲孩子表示法


(这里0表示没有)

image.png

如果用这个方法会比较浪费空间,而且a,b方法找孩子或者双亲比较麻烦

5、树的常考性质

1) 结点数 = 总度数 + 1

2) 度为m的树,m叉树的区别

image.png 3)度为m的树第 i 层至多有m^i-1 个结点(i>=1)

image.png

4) 高度为h的m叉树至多有 m^h - 1/ m-1

image.png

 5) 高度为为h的二叉树至少有h个结点,

高度为h,度为m的树至少有h+m-1个结点。

image.png

6) 具有n个结点的m叉树的最小高度为| logm(n(m- 1) + 1)]

image.png

二、二叉树

1.如何引入二叉树

孩子链表示法

image.png

孩子兄弟表示法

image.png

孩子兄弟表示法秘诀    长子当做左孩子,兄弟关系左右斜

2.相互转换

(1)树转换二叉树

image.png

(2)二叉树还原为树


image.png

(3) 森林转化为二叉树

image.png

3.二叉树概念

二叉树(Binary Tree)是n(n≥0)个结点所构成的集合,它或为空树(n=0);或为非空树。对于非空树T满足:


(1)有且仅有一个称为根的结点;        


(2)除根结点以外,其余结点分为两个互不相交的子集T1和T2,分别称为T的左子树和右子树,且T1和T2本身都是二叉树

image.png

4.二叉树的五种状态

image.png

5.几种特殊的二叉树

满二叉树完全二叉树

如下图(绿色的为叶子结点)

image.png

二叉排序树

可以通过二叉排序树快速的进行查找和插入

image.png

平衡二叉树

image.png

6.二叉树的性质

性质1: image.png

性质2:image.png

性质3 :image.png

7.完全二叉树的常考性质

考点1:

下面这个符号注意不是绝对值,是向上取整的意思

image.png

下面这个符号是向下取整的意思

image.png

考点2:

image.png

总结


二叉树: no= n2+ 1



·第i层至多有2i1个结点( i≥1)



·高度为h的二叉树至多有2h -1个结点



完全二叉树:

具有n个 (n>0)结点的完全二叉树的高度h为|log,(n + 1)7或Llog2n]+ 1


对于完全二叉树,可以由的结点数n推出为0、1和2的结点个数为n、n1和n,(突破点:完全二叉树最多只会有一个度为1的结点)

8.二叉树的存储

image.png

几个常考的操作

 image.png

但是如果存储的是非完全二叉树,采用顺序存储会浪费很多空间,所以非完全二叉树基本不考虑这种

image.png

代码

struct Elemtype{
  int value;
};
//二叉树的结点
typedef struct BiTNode{
     Elemtype date;  //数据域
     struct BiTNode *lchild ,*rchild;  //左右孩子指针
}BiTNode ,*BiTree;
//定义一个空树
BiTree root = NULL;
//插入根结点
root = (Bitree) malloc(sizeof(BiTnode));
root->date = {1};
root->lchild = NULL; 
root->rchild = NULL;
//插入新的结点
 BiTnode *p = (BiTNode *)malloc(sizeof(BiTNode));
 p->date = {2};
 p->lchild = NULL;
 p->rchild = NULL;
 root->lchild = p;          //作为根结点的左孩子 

image.png

但是这样如果想找到父结点,我们只能从根开始遍历,这样非常浪费时间,我们可以根据题目要求设置一个父结点,也叫三叉链表

1.typedef struct BiTNode{
     Elemtype date;  //数据域
     struct BiTNode *lchild ,*rchild;  //左右孩子指针 
     struct BiTNode *parent;  //父结点
}BiTNode ,*BiTree;
相关文章
|
1月前
|
Java C++
【C++数据结构——树】二叉树的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现二叉树的基本运算。​ 相关知识 创建二叉树 销毁二叉树 查找结点 求二叉树的高度 输出二叉树 //二叉树节点结构体定义 structTreeNode{ intval; TreeNode*left; TreeNode*right; TreeNode(intx):val(x),left(NULL),right(NULL){} }; 创建二叉树 //创建二叉树函数(简单示例,手动构建) TreeNode*create
48 12
|
1月前
|
C++
【C++数据结构——树】二叉树的性质(头歌实践教学平台习题)【合集】
本文档介绍了如何根据二叉树的括号表示串创建二叉树,并计算其结点个数、叶子结点个数、某结点的层次和二叉树的宽度。主要内容包括: 1. **定义二叉树节点结构体**:定义了包含节点值、左子节点指针和右子节点指针的结构体。 2. **实现构建二叉树的函数**:通过解析括号表示串,递归地构建二叉树的各个节点及其子树。 3. **使用示例**:展示了如何调用 `buildTree` 函数构建二叉树并进行简单验证。 4. **计算二叉树属性**: - 计算二叉树节点个数。 - 计算二叉树叶子节点个数。 - 计算某节点的层次。 - 计算二叉树的宽度。 最后,提供了测试说明及通关代
46 10
|
1月前
|
存储 算法 C++
【C++数据结构——图】图的邻接矩阵和邻接表的存储(头歌实践教学平台习题)【合集】
本任务要求编写程序实现图的邻接矩阵和邻接表的存储。需掌握带权有向图、图的邻接矩阵及邻接表的概念。邻接矩阵用于表示顶点间的连接关系,邻接表则通过链表结构存储图信息。测试输入为图的顶点数、边数及邻接矩阵,预期输出为Prim算法求解结果。通关代码提供了完整的C++实现,包括输入、构建和打印邻接矩阵与邻接表的功能。
49 10
|
1月前
|
存储 算法 测试技术
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
50 2
|
9月前
|
存储 编译器 程序员
c++存储类
c++存储类
68 3
|
7月前
|
存储 Prometheus Cloud Native
SLS Prometheus存储问题之为什么SLS时序引擎最终选择了使用C++实现PromQL的部分算子
SLS Prometheus存储问题之为什么SLS时序引擎最终选择了使用C++实现PromQL的部分算子
|
7月前
|
存储 C++
【C++】二叉树进阶之二叉搜索树(下)
【C++】二叉树进阶之二叉搜索树(下)
42 4
|
7月前
|
Java 编译器 C++
【C++】二叉树进阶之二叉搜索树(上)
【C++】二叉树进阶之二叉搜索树(上)
42 3
|
7月前
|
算法 C++
【C++高阶】高效搜索的秘密:深入解析搜索二叉树
【C++高阶】高效搜索的秘密:深入解析搜索二叉树
56 2
|
9月前
|
存储 C++
【C++】二叉树进阶 -- 详解
【C++】二叉树进阶 -- 详解