【数据结构】树和二叉树的基础知识

简介: 数据结构中的树及二叉树的相关知识

前言


本章主要讲解:


数据结构中的树及二叉树的相关知识



树概念及结构



  • 概念:


树是一种非线性的数据结构,它是由nn>=0)个有限结点组成一个具有层次关系的集合

把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的


注意:

有一个特殊的结点,称为根结点(根节点没有前驱结点)

其余结点被分成 M(M>0) 个互不相交的集合 T1 、 T2 、 …… 、 Tm ,其中每一个集合 Ti(1<=i<= m)又是一棵结构与树类似的子树

每棵子树的根结点有且只有一个前驱,可以有 0 个或多个后继,因此,树是递归定义 的


52.png


  • 注:


  1. 树形结构中,子树之间不能有交集,否则就不是树形结构
  2. 除了根节点外,每个节点有且只有一个父节点
  3. 一棵树N个节点的树有N-1条边



相关概念


  • 图示:


53.png


53.png


树的表示


树结构相对线性表就比较复杂了:既要保存值域,也要保存结点和结点之间的关系

实际中树的多种表示:双亲表示法,孩子表示法、孩子双亲表示法以及孩子兄弟表示法

注:这里就简单的了解其中最常用的孩子兄弟表示法(相比来说最好的)

结构:


typedef int DataType;//数据类型
struct Node
{
 struct Node* firstChild1; // 第一个孩子结点
 struct Node* pNextBrother; // 指向其下一个兄弟结点
 DataType data; // 结点中的数据域
};


图示:


54.png

树的实际运用:文件系统的目录树结构


55.png


二叉树概念及结构


  • 概念:


二叉树由一个根节点加上左子树和右子树组成:

1.二叉树度最大为2(度可以为0,1,2)

2.二叉树的子树有左右之分,次序不能颠倒(有序树)(没有左树,一定没有右树;有左树,不一定有右树)


56.png


特殊的二叉树


  • 满二叉树:


一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树

也就是说,如果一个二叉树的层数为K,且结点总数是2^k-1,则它就是满二叉树


  • 完全二叉树:


完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的(特殊的完全二叉树)

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


图示:

57.png


二叉树的性质

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

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

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

解释: 当只有一个节点时,n0=1,n2=0(符合)

接下来每增加一度2的树,都会增加2个度0的树(画图归纳理解)(符合)


图示:性质3


58.png


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


5.对于具有 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 否则无右孩子


图示:性质5



59.png


二叉树的存储结构


  • 存储结构类型:


顺序存储


顺序结构存储就是使用数组来存储,一般使用数组只适合表示完全二叉树(不完全二叉树有空间的浪费而现实中使用中只有堆才会使用数组来存储

注:二叉树顺序存储在物理上是一个数组,在逻辑上是一颗二叉树


  • 图示:


60.png


链式存储


用链表来表示一棵二叉树,即用链来指示元素的逻辑关系

通常的方法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址

链式结构又分为二叉链和三叉链,当前我们学习中一般都是二叉链(红黑树等结构会用到三叉链)


图示:


61.png


62.png


typedef int BTDataType;
// 二叉链
struct BinaryTreeNode
{
    struct BinTreeNode* _pLeft; // 指向当前节点左孩子
    struct BinTreeNode* _pRight; // 指向当前节点右孩子
    BTDataType _data; // 当前节点值域
}


// 三叉链
struct BinaryTreeNode
{
 struct BinTreeNode* _pParent; // 指向当前节点的双亲
 struct BinTreeNode* _pLeft; // 指向当前节点左孩子
 struct BinTreeNode* _pRight; // 指向当前节点右孩子
 BTDataType _data; // 当前节点值域
};



相关文章
|
2月前
|
算法
数据结构之博弈树搜索(深度优先搜索)
本文介绍了使用深度优先搜索(DFS)算法在二叉树中执行遍历及构建链表的过程。首先定义了二叉树节点`TreeNode`和链表节点`ListNode`的结构体。通过递归函数`dfs`实现了二叉树的深度优先遍历,按预序(根、左、右)输出节点值。接着,通过`buildLinkedList`函数根据DFS遍历的顺序构建了一个单链表,展示了如何将树结构转换为线性结构。最后,讨论了此算法的优点,如实现简单和内存效率高,同时也指出了潜在的内存管理问题,并分析了算法的时间复杂度。
67 0
|
15天前
|
存储 C++
【C++数据结构——树】哈夫曼树(头歌实践教学平台习题) 【合集】
【数据结构——树】哈夫曼树(头歌实践教学平台习题)【合集】目录 任务描述 相关知识 测试说明 我的通关代码: 测试结果:任务描述 本关任务:编写一个程序构建哈夫曼树和生成哈夫曼编码。 相关知识 为了完成本关任务,你需要掌握: 1.如何构建哈夫曼树, 2.如何生成哈夫曼编码。 测试说明 平台会对你编写的代码进行测试: 测试输入: 1192677541518462450242195190181174157138124123 (用户分别输入所列单词的频度) 预
52 14
【C++数据结构——树】哈夫曼树(头歌实践教学平台习题) 【合集】
|
15天前
|
Java C++
【C++数据结构——树】二叉树的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现二叉树的基本运算。​ 相关知识 创建二叉树 销毁二叉树 查找结点 求二叉树的高度 输出二叉树 //二叉树节点结构体定义 structTreeNode{ intval; TreeNode*left; TreeNode*right; TreeNode(intx):val(x),left(NULL),right(NULL){} }; 创建二叉树 //创建二叉树函数(简单示例,手动构建) TreeNode*create
39 12
|
15天前
|
C++
【C++数据结构——树】二叉树的性质(头歌实践教学平台习题)【合集】
本文档介绍了如何根据二叉树的括号表示串创建二叉树,并计算其结点个数、叶子结点个数、某结点的层次和二叉树的宽度。主要内容包括: 1. **定义二叉树节点结构体**:定义了包含节点值、左子节点指针和右子节点指针的结构体。 2. **实现构建二叉树的函数**:通过解析括号表示串,递归地构建二叉树的各个节点及其子树。 3. **使用示例**:展示了如何调用 `buildTree` 函数构建二叉树并进行简单验证。 4. **计算二叉树属性**: - 计算二叉树节点个数。 - 计算二叉树叶子节点个数。 - 计算某节点的层次。 - 计算二叉树的宽度。 最后,提供了测试说明及通关代
38 10
|
16天前
|
存储 算法 测试技术
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
39 2
|
29天前
|
数据库
数据结构中二叉树,哈希表,顺序表,链表的比较补充
二叉搜索树,哈希表,顺序表,链表的特点的比较
数据结构中二叉树,哈希表,顺序表,链表的比较补充
|
2月前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
91 5
|
2月前
|
机器学习/深度学习 存储 算法
数据结构实验之二叉树实验基础
本实验旨在掌握二叉树的基本特性和遍历算法,包括先序、中序、后序的递归与非递归遍历方法。通过编程实践,加深对二叉树结构的理解,学习如何计算二叉树的深度、叶子节点数等属性。实验内容涉及创建二叉树、实现各种遍历算法及求解特定节点数量。
117 4
|
2月前
|
C语言
【数据结构】二叉树(c语言)(附源码)
本文介绍了如何使用链式结构实现二叉树的基本功能,包括前序、中序、后序和层序遍历,统计节点个数和树的高度,查找节点,判断是否为完全二叉树,以及销毁二叉树。通过手动创建一棵二叉树,详细讲解了每个功能的实现方法和代码示例,帮助读者深入理解递归和数据结构的应用。
180 8
|
2月前
|
算法
数据结构之文件系统模拟(树数据结构)
本文介绍了文件系统模拟及其核心概念,包括树状数据结构、节点结构、文件系统类和相关操作。通过构建虚拟环境,模拟文件的创建、删除、移动、搜索等操作,展示了文件系统的基本功能和性能。代码示例演示了这些操作的具体实现,包括文件和目录的创建、移动和删除。文章还讨论了该算法的优势和局限性,如灵活性高但节点移除效率低等问题。
80 0

热门文章

最新文章