【霍罗维兹数据结构】树的基本概念 | 树的表示 | 二叉树 - BINARY TREES

简介: 【霍罗维兹数据结构】树的基本概念 | 树的表示 | 二叉树 - BINARY TREES



前言:

最近在读霍罗维兹的《数据结构基础》(Fundamentals of Data Structures in C),本篇博客为阅读笔记和知识总结。


Ⅰ.  介绍

0x00  树的概念

"The intuitive concept of a tree implies that we organize the data."

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

❓ 那么为什么叫 "树" 呢?

💡 我们之所以把它成为 "树",是因为它很像我们现实生活中的树。只是它是倒过来的,根朝上叶子朝下。

0x01  定义

树是满意足下条件并包含至少一个结点的有限集合:

① 树中有一个特别指定的结点,称为根。

② 其他节点划分成 个不相交的集合 ,每个集合又还是一棵树,我们称 为根的子数。

0x02  树的各种术语

为讨论树方便计,给出树的各种术语。

A node stands for the item of information and the branches to other nodes.

The degree of a node is the number of subtrees of the node.

The degree of a tree is the maximum degree of the nodes in the tree.

A node with degree zero is a leaf or terminal node.

A node that has subtrees is the parent of the roots of the subtrees, and the roots of the subtrees are the children of the node.

Children of the same parent are siblings.

The ancestors of a node are all the nodes along the path from the root to the node. Conversely, the descendants of a node are all the nodes that are in its subtrees.

💧  节点的度(degree):一个节点含有的子树的个数称为该节点的度。 比如上图中,A的度为6。

🍃 叶子结点(leaf):又称终端节点(terminal),度为0的节点称为叶子结点。 比如上图中,BCHIPQ等节点就是叶子结点,因为它们的度为0。

➰ 分支节点:又称非终端节点,度不为0的节点称为分支节点。 比如上图中,DEFG等节点就是分支节点,因为他们的度不为0。

👨 父节点(parent):又称双亲结点,若一个节点有子节点,则这个节点称作其子节点的父节点。 比如上图中,A是B的父节点。

👶 子节点(child):又称孩子节点,若一个节点有根节点,则称为该节点的子节点。 如上图,B是A的子节点。

👦 兄弟节点(siblings):具有相同父节点的节点互相称为兄弟节点。 同一个父亲生的才算。如上图,B和C是兄弟节点,它们的父节点都是A。

🌳 树的度(degree of a tree):一棵树中最大的节点的度称为树的度。 如上图,最大的节点是A,有6个子树,故A的度为6,所以树的度为6。

💭 节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推。 也有将根定义为第0层,根的子节点为第1层的。但是我们建议还是使用根为第1层来定义比较好。

🌊 树的高度:又称树的深度,树中节点的最大层次。 如上图,树的高度为 4。

👱‍♂️ 堂兄弟节点:父节点在同一层的节点,它们互为堂兄弟。如上图,H 和 I 互为堂兄弟。

🧔 节点的祖先(ancestors):从根到该节点所经分支上的所有节点。 如上图·,A是所有节点的祖先。

👨‍👦‍👦 子孙(descendants):以某节点为根的子树中任一节点都称为该节点的子孙。如上图,所有节点都是A的子孙。

🌄 森林:由 m(m > 0) 棵互不相交的树的集合称为森林。 比如并查集,多个树构成森林。

Ⅱ.  树的表示

0x00  链表表示

链表就可以是树的一种表示方法,上树就可以用如下形式写出:

如果我们使用链表,那么一个节点必须有不同数量的字段,这取决于分支的数量。

树的可能表示:

通常情况下,使用固定大小的节点会更容易些。

0x01  左孩子又兄弟表示 - Left Child-Right Sibling Representation

该存储表示首先要求把一般的树转换成仅有的两个链域的形式。

每个节点至多只有一个左孩子,并且仅靠左孩子右边至多只有一个兄弟。

(严格来说,树中子节点的顺序并不重要)

typedef int DataType;
struct Node {
    struct Node* _firstChind1;   // 永远指向第一个孩子
    struct Node* _pNextBrother;  // 指向孩子右边的兄弟
    DataType _data;
};

0x02  2-度树的表示

Ⅲ.  二叉树 - BINARY TREES

0x00  二叉树的抽象数据类型

📚 定义:二叉树既然叫二叉树,顾名思义即度最大为2的树称为二叉树。 它的度可以为 1 也可以为 0,但是度最大为 2 。

二叉树的主要特征:任意节点的度不超过2。

对于二叉树,我们区分了左子树和右子树,而对于树来说,子树的顺序是不重要的。

定义:二叉树是一个节点的有限集合,它要么是空的,要么是由一个根和两个不相交的二叉树组成,称为左子树和右子树。

📌 注意:对于任意的二叉树都是由以下几种情况复合而成的:

0x01  二叉树与树的差别

① 二叉树可是空树。

(2) 在二叉树中,我们区分左右子数顺序,而树不区分子数的顺序。

例子:两种不同的二叉树

二叉树的特殊类型:倾斜树完全二叉树

当然了,我们用来描述树的术语也同样适用于二叉树。

0x02  完全二叉树

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

📜 前 层是满的,最后一层不满,但是最后一层从左到右是连续的。

完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。所以,满二叉树是一种特殊的完全二叉树(每一层节点均为2)。

📚 常识:

① 完全二叉树中,度为 1 的最多只有 1 个。

② 高度为 的完全二叉树节点范围是    

0x03  二叉树的性质

📚 四点规则:

① 若规定根节点的层数为 1 ,则一颗非空二叉树的第 层上最多有 个节点。

② 若规定根节点的层数为 1 ,则深度为 的二叉树最大节点数是 .

③ 对任何一颗二叉树,如果度为 0 其叶子结点个数为 ,度为 2 的分支节点个数为 ,则有   。换言之,度为 0 的永远比度为 2 的多一个叶子结点。

④ 若规定根节点的层数为 1 , 具有 个节点的满二叉树的深度     (log是以2为底,n+1的对数)。

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

(非完全二叉树,也可以用数组存放,但会浪费很多空间)

假设 是父节点在数组中的下标,此公式仅适用于完全二叉树:

① 求左孩子:

② 求右孩子:

③ 求父亲(假设不关注是左孩子还是右孩子):

                       

④  判断是否有左孩子:    

⑤  判断是否由右孩子:    


参考资料

Fundamentals of Data Structures in C

相关文章
|
1月前
|
存储 C++
【C++数据结构——树】哈夫曼树(头歌实践教学平台习题) 【合集】
【数据结构——树】哈夫曼树(头歌实践教学平台习题)【合集】目录 任务描述 相关知识 测试说明 我的通关代码: 测试结果:任务描述 本关任务:编写一个程序构建哈夫曼树和生成哈夫曼编码。 相关知识 为了完成本关任务,你需要掌握: 1.如何构建哈夫曼树, 2.如何生成哈夫曼编码。 测试说明 平台会对你编写的代码进行测试: 测试输入: 1192677541518462450242195190181174157138124123 (用户分别输入所列单词的频度) 预
59 14
【C++数据结构——树】哈夫曼树(头歌实践教学平台习题) 【合集】
|
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++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
49 2
|
3月前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
328 9
|
3月前
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
53 1
|
1月前
|
存储 C语言 C++
【C++数据结构——栈与队列】顺序栈的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现顺序栈的基本运算。开始你的任务吧,祝你成功!​ 相关知识 初始化栈 销毁栈 判断栈是否为空 进栈 出栈 取栈顶元素 1.初始化栈 概念:初始化栈是为栈的使用做准备,包括分配内存空间(如果是动态分配)和设置栈的初始状态。栈有顺序栈和链式栈两种常见形式。对于顺序栈,通常需要定义一个数组来存储栈元素,并设置一个变量来记录栈顶位置;对于链式栈,需要定义节点结构,包含数据域和指针域,同时初始化栈顶指针。 示例(顺序栈): 以下是一个简单的顺序栈初始化示例,假设用C语言实现,栈中存储
142 77
|
2天前
|
DataX
☀☀☀☀☀☀☀有关栈和队列应用的oj题讲解☼☼☼☼☼☼☼
### 简介 本文介绍了三种数据结构的实现方法:用两个队列实现栈、用两个栈实现队列以及设计循环队列。具体思路如下: 1. **用两个队列实现栈**: - 插入元素时,选择非空队列进行插入。 - 移除栈顶元素时,将非空队列中的元素依次转移到另一个队列,直到只剩下一个元素,然后弹出该元素。 - 判空条件为两个队列均为空。 2. **用两个栈实现队列**: - 插入元素时,选择非空栈进行插入。 - 移除队首元素时,将非空栈中的元素依次转移到另一个栈,再将这些元素重新放回原栈以保持顺序。 - 判空条件为两个栈均为空。
|
1月前
|
存储 C++ 索引
【C++数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】
【数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】初始化队列、销毁队列、判断队列是否为空、进队列、出队列等。本关任务:编写一个程序实现环形队列的基本运算。(6)出队列序列:yzopq2*(5)依次进队列元素:opq2*(6)出队列序列:bcdef。(2)依次进队列元素:abc。(5)依次进队列元素:def。(2)依次进队列元素:xyz。开始你的任务吧,祝你成功!(4)出队一个元素a。(4)出队一个元素x。
43 13
【C++数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】
|
1月前
|
存储 C语言 C++
【C++数据结构——栈与队列】链栈的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现链栈的基本运算。开始你的任务吧,祝你成功!​ 相关知识 初始化栈 销毁栈 判断栈是否为空 进栈 出栈 取栈顶元素 初始化栈 概念:初始化栈是为栈的使用做准备,包括分配内存空间(如果是动态分配)和设置栈的初始状态。栈有顺序栈和链式栈两种常见形式。对于顺序栈,通常需要定义一个数组来存储栈元素,并设置一个变量来记录栈顶位置;对于链式栈,需要定义节点结构,包含数据域和指针域,同时初始化栈顶指针。 示例(顺序栈): 以下是一个简单的顺序栈初始化示例,假设用C语言实现,栈中存储整数,最大
46 9

热门文章

最新文章