【霍罗维兹数据结构】树的基本概念 | 二叉树 | 阅读笔记

 

前言:

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


Ⅰ.  介绍

0x00  树的概念

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

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

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

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

【霍罗维兹数据结构】树的基本概念 | 二叉树 | 阅读笔记_第1张图片

【霍罗维兹数据结构】树的基本概念 | 二叉树 | 阅读笔记_第2张图片

0x01  定义

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

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

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

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  链表表示

【霍罗维兹数据结构】树的基本概念 | 二叉树 | 阅读笔记_第3张图片

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

(A(B(E(K,L),F),C(G),D(H(M),I,J)))

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

树的可能表示:

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

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

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

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

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

【霍罗维兹数据结构】树的基本概念 | 二叉树 | 阅读笔记_第4张图片

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

0x02  2-度树的表示

【霍罗维兹数据结构】树的基本概念 | 二叉树 | 阅读笔记_第5张图片

 

Ⅲ.  二叉树 - BINARY TREES

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

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

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

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

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

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

0x01  二叉树与树的差别

① 二叉树可是空树。

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

例子:两种不同的二叉树

【霍罗维兹数据结构】树的基本概念 | 二叉树 | 阅读笔记_第6张图片

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

【霍罗维兹数据结构】树的基本概念 | 二叉树 | 阅读笔记_第7张图片

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

【霍罗维兹数据结构】树的基本概念 | 二叉树 | 阅读笔记_第8张图片

 

0x02  完全二叉树

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

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

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

常识:

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

② 高度为 h 的完全二叉树节点范围是   [ 2^{h-1} - 1 + 1, 2^{h} - 1 ]  

 

0x03  二叉树的性质

  四点规则:

 ① 若规定根节点的层数为 1 ,则一颗非空二叉树的第 i 层上最多有 2^{(i-1)} 个节点。

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

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

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

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

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

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

① 求左孩子: leftChild = parent * 2 + 1

② 求右孩子:rightChild = parent*2+2

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

                      parent = \frac{child-1}{2}   

④  判断是否有左孩子:  2*parent+1\geq n  

⑤  判断是否由右孩子:  2*parent+2 \geq n   


参考资料

Fundamentals of Data Structures in C

你可能感兴趣的:(霍洛维兹《数据结构基础》,数据结构)