初阶数据结构 初识二叉树

简介: 初阶数据结构 初识二叉树

一. 树


1. 基本概念


树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。


这里又几个容易错的概念给大家解释下


1 当n等于0时 它也是一个数 这时候将它称之为空数

4d0c7cc45efc4fc1893334b6b50ddbe9.png



2 除根节点外,其余结点被分成M(M>0)个互不相交的集合T1、T2、……、Tm,其中每一个集合Ti(1<= i <= m)又是一棵结构与树类似的子树。每棵子树的根结点有且只有一个前驱,可以有0个或多个后继


3 子数是不相交的

c516659868f846c1a43ec701fafd2432.png



4 除了根节点外 所有节点有且只有一个父节点


58b838c79b414b62a8b40aa2d53bbfca.png


5 一个N个节点的树一定有N-1个边


53fea195307145b4a29d76f3cf3aa189.png


2. 常用术语


1.节点的度:一个节点含有的子树的个数称为该节点的度


这个很容易理解


比如说上图的A就有6个度


上图的D就有两个度


J有0个度


2.非终端节点或分支节点


度不等于0的节点就是非终端或分支节点


比如说 A D


3.双亲节点或父节点


如果说一个节点拥有子节点 那么就称这个节点是它们子节点的父节点


比如说F是K的父节点


G是N的父节点


4.孩子节点或子节点


这个和上面的概念相反


只需要反过来就可以了


比如说


K是F的子节点


N是G的子节点


4.树的度


一个树中最大节点的度称为这个树的度


5.节点的层次


从树的根开始定义 第一层是根 第二层是根的子节点 以此类推


60树的高度或深度

树的最大层次称为这个数的高度


7.堂兄弟节点(不常用)


在同一层次的节点叫做堂兄弟节点


8.节点的祖先


从根到该节点所经分支上的所有节点


例如说 在上图中A是所有节点的祖先


9.子孙


以某节点为根的子树中任一节点都称为该节点的子孙


例如上图中所有节点都是A的子孙


10.由m(m>0)棵互不相交的树的集合称为森林


这个概念了解就好 我们目前阶段其实用的不多


3. 代码表示


树结构相对线性表就比较复杂了,要存储表示起来就比较麻烦了,实际中树有很多种表示方式,如:双亲表示法,孩子表示法、孩子兄弟表示法等等。我们这里就简单的了解其中最常用的孩子兄弟表示法。


代码表示如下


typedef int DateType; // 定义我们下面的数据类型 
struct Node
{
  struct Node* firstchild; // 第一个孩子节点
  struct Node* pnextbrothr; // 第一个兄弟节点
  DateType date;// 存储的数据  
};


我们将每个节点储存它们的第一个孩子节点和第一个兄弟节点


那么我们要查找的时候就会是这样子


e87ed979d5914b8d80cf352c18d80fa2.png


看上去很清晰是吧


4. 实际运用

2ed4800afa2649cd8a56d8493aba5720.png


我们储存文件 就是使用的树这一种数据结构来存储的


想想看是不是


我们点开C盘 然后出现很多的文件


再点开一个 又会出现很多的文件




二. 二叉树


1. 基本概念


一棵二叉树是结点的一个有限集合,该集合或者为空,或者是由一个根节点加上两棵别称为左子树和右子树的二叉树组成。


二叉树的特点:


每个结点最多有两棵子树,即二叉树不存在度大于2的结点。

二叉树的子树有左右之分,其子树的次序不能颠倒。


2. 特殊的二叉树


满二叉树:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为K,且结点总数是(2^k) -1 ,则它就是满二叉树。


完全二叉树:完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。 要注意的是满二叉树是一种特殊的完全二叉树。


这里我们有两个比较特殊的二叉树


一个叫做满二叉树


一个叫做完全二叉树


什么是满二叉树呢?


就是除了根节点和叶节点之外 每一个节点的度数都是2


什么是完全二叉树呢?


当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树


我们这里要注意的是 满二叉树是一种特殊的完全二叉树


三. .二叉树的顺序结构及实现


(1)顺序结构


普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。

现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储,需要注意的是这里的堆和操作系统虚拟进程地址空间中的堆是两回事,一个是数据结构,一个是操作系统中管理内存的一块区域分段。

81bebf6ff3d2431aa699588a0647f5f7.png


顺序结构就是将二叉树按照从左到右 从上到下的顺序存储到数组当中


如果说不是一个完全二叉树的话就势必要空出来很多的位置 从而导致空间的浪费


(2)链式存储


二叉树的链式存储结构是指,用链表来表示一棵二叉树,即用链来指示元素的逻辑关系。 通常的方法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址 。

链式结构又分为二叉链和三叉链,当前我们学习中一般都是二叉链,后面课程学到高阶数据结构如红黑树等会用到三叉链。


这里简单提一下 大家有个印象就好


我们这几篇博客主要介绍顺序存储



c174cce91b7443da9e7d9b5d13d45231.png

代码表示如下


typedef int DateType; // 定义我们下面的数据类型 
struct Node
{
  struct Node* firstchild; // 第一个孩子节点
  struct Node* pnextbrothr; // 第一个兄弟节点
  DateType date;// 存储的数据  
};


四. 二叉树的性质


若规定根节点的层数为1,则一棵非空二叉树的第i层上最多有2^(i-1) 个结点.


若规定根节点的层数为1,则深度为h的二叉树的最大结点数是2^h- 1.


对任何一棵二叉树, 如果度为0其叶结点个数为 n0, 度为2的分支结点个数为 n2,则有n0=n2+1


若规定根节点的层数为1,具有n个结点的满二叉树的深度,h=Log2(n+1). (ps:Log2(n+1)是log以2为

底,n+1为对数)


对于具有n个结点的完全二叉树,如果按照从上至下从左至右的数组顺序对所有节点从0开始编号,则对

于序号为i的结点有:


1.若i>0,i位置节点的双亲序号:(i-1)/2;i=0,i为根节点编号,无双亲节点

2.若2i+1<n,左孩子序号:2i+1,2i+1>=n否则无左孩子

3.若2i+2<n,右孩子序号:2i+2,2i+2>=n否则无右孩子


五 两道简单题


题目一


某二叉树共有 399 个结点,其中有 199 个度为 2 的结点,则该二叉树中的叶子结点数为( )

A 不存在这样的二叉树

B 200

C 198

D 199


这个刚好符合我们的性质3


对任何一棵二叉树, 如果度为0其叶结点个数为 n0, 度为2的分支结点个数为 n2,则有n0=n2+1


所以说叶节点或者说度为0的节点的个数是200


题目二


.在具有 2n 个结点的完全二叉树中,叶子结点个数为( )


A n

B n+1

C n-1

D n/2


这个时候我们假设将叶子的节点分为三种


一是度为0的节点 X0


一是度为2的节点 X2 (X0-1)


一是度为1的节点 X1(0或1)


这里要注意的是 再一个完全二叉树中度为1的节点只有可能是0或1


所以说总的节点数等于


2X0-1+1 = 2n


或者


2X0 = 2n+1


所以说X0的个数为 N或者 (2N+1)/2


所以说叶节点的个数为n


相关文章
|
5天前
|
Java C++
【C++数据结构——树】二叉树的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现二叉树的基本运算。​ 相关知识 创建二叉树 销毁二叉树 查找结点 求二叉树的高度 输出二叉树 //二叉树节点结构体定义 structTreeNode{ intval; TreeNode*left; TreeNode*right; TreeNode(intx):val(x),left(NULL),right(NULL){} }; 创建二叉树 //创建二叉树函数(简单示例,手动构建) TreeNode*create
31 12
|
5天前
|
C++
【C++数据结构——树】二叉树的性质(头歌实践教学平台习题)【合集】
本文档介绍了如何根据二叉树的括号表示串创建二叉树,并计算其结点个数、叶子结点个数、某结点的层次和二叉树的宽度。主要内容包括: 1. **定义二叉树节点结构体**:定义了包含节点值、左子节点指针和右子节点指针的结构体。 2. **实现构建二叉树的函数**:通过解析括号表示串,递归地构建二叉树的各个节点及其子树。 3. **使用示例**:展示了如何调用 `buildTree` 函数构建二叉树并进行简单验证。 4. **计算二叉树属性**: - 计算二叉树节点个数。 - 计算二叉树叶子节点个数。 - 计算某节点的层次。 - 计算二叉树的宽度。 最后,提供了测试说明及通关代
31 10
|
5天前
|
存储 算法 测试技术
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
23 2
|
19天前
|
数据库
数据结构中二叉树,哈希表,顺序表,链表的比较补充
二叉搜索树,哈希表,顺序表,链表的特点的比较
数据结构中二叉树,哈希表,顺序表,链表的比较补充
|
2月前
|
机器学习/深度学习 存储 算法
数据结构实验之二叉树实验基础
本实验旨在掌握二叉树的基本特性和遍历算法,包括先序、中序、后序的递归与非递归遍历方法。通过编程实践,加深对二叉树结构的理解,学习如何计算二叉树的深度、叶子节点数等属性。实验内容涉及创建二叉树、实现各种遍历算法及求解特定节点数量。
108 4
|
2月前
|
C语言
【数据结构】二叉树(c语言)(附源码)
本文介绍了如何使用链式结构实现二叉树的基本功能,包括前序、中序、后序和层序遍历,统计节点个数和树的高度,查找节点,判断是否为完全二叉树,以及销毁二叉树。通过手动创建一棵二叉树,详细讲解了每个功能的实现方法和代码示例,帮助读者深入理解递归和数据结构的应用。
160 8
|
3月前
|
存储 算法 关系型数据库
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
这篇文章主要介绍了多路查找树的基本概念,包括二叉树的局限性、多叉树的优化、B树及其变体(如2-3树、B+树、B*树)的特点和应用,旨在帮助读者理解这些数据结构在文件系统和数据库系统中的重要性和效率。
37 0
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
|
3月前
|
存储 算法 搜索推荐
数据结构与算法学习十七:顺序储存二叉树、线索化二叉树
这篇文章主要介绍了顺序存储二叉树和线索化二叉树的概念、特点、实现方式以及应用场景。
47 0
数据结构与算法学习十七:顺序储存二叉树、线索化二叉树
|
3月前
|
存储 算法
探索数据结构:分支的世界之二叉树与堆
探索数据结构:分支的世界之二叉树与堆
|
3月前
|
存储 算法
数据结构与算法学习十六:树的知识、二叉树、二叉树的遍历(前序、中序、后序、层次)、二叉树的查找(前序、中序、后序、层次)、二叉树的删除
这篇文章主要介绍了树和二叉树的基础知识,包括树的存储方式、二叉树的定义、遍历方法(前序、中序、后序、层次遍历),以及二叉树的查找和删除操作。
39 0