一对多的美——数据结构之树和二叉树

树和二叉树

数的定义

是n(n≥0)个结点的有限集
若 n = 0,称为空树:
若 n > 0,则它满足如下两个条件;
(1)有且仅有一个特定的称为(Root)的结点;
(2)其余结点可分为m(m≥0)个互不相交的有限集T1,T2,T3,···,Tm,其中每一个集合本身又是一棵树,并称为根的子树(SubTree)。

树是n个结点的有限集

树还有其他的表示方式:嵌套集合、广义表、凹入表示。

树的基本术语

1.结点的度结点的子树个数(A结点度为3)
2.树的度树的所有结点的度的最大值(为3)
3.叶子结点度为0的结点(E、F、H…)
4.非终端结点度不为0的结点(A、B、C、D)
5.双亲和孩子结点的子树的根称为该结点的孩子,相应的,该结点称为孩子的双亲(C是H的双亲,H是C的孩子)
6.兄弟同一双亲的孩子之前互称兄弟(E、F、G)
7.祖先从根到该结点所经分支上的所有结点(F的祖先是A、B)
8.子孙以某结点为根的子树中的任一结点都是(B的子孙为E、F、G)
9.层次结点的层次从根开始定义起,根为第一层,根的孩子为第二层。
10.堂兄弟双亲在同一层的结点互为堂兄弟(H与E、F、G、I、J)
11.树的深度树中结点的最大层次称为树的深度或高度(图中为3)
12.有序树树中结点的各子树从左至右有次序(最左边的为第一个孩子)
13.无序树树中结点的各子树无词序
14.森林是m(m≥0)棵互不相交的树的集合
如下图:
在这里插入图片描述

二叉树

二叉树的定义

  • 为什么要研究二叉树?
    二叉树的结构最简单,规律性最强;并且可以证明,所有的树都能转化为唯一对应的二叉树,不失一般性。

二叉树是n(n≥0)个结点的有限集,它或者是空集(n=0),或者由一个根节点两颗互不相交的分别称作这个根的左子树右子树的二叉树组成。

  • 特点
    1.每个结点最多有俩孩子(二叉树中不存在度大于2 的结点
    2.子树有左右之分,其次序不能颠倒。
    3.二叉树可以是空集合,根可以有空的左子树或空的右子树。

注意:二叉树不是树的特殊情况,它们是两个概念!
二叉树结点的子树要区别左子树和右子树,即使只有一棵子树也要进行区分,说明它是左子树,还是右子树。而树当结点只有一个孩子时,就不用区别是左还是右的次序,这是两者最主要的差别。
由此我们可知:
若我们给出3个结点:
在这里插入图片描述

二叉树的5种基本形态
在这里插入图片描述

满二叉树和完全二叉树

满二叉树一颗深度为k且有2^k-1个结点的二叉树称为满二叉树;
特点:1.每一层上的结点数都是最大结点数(即每层都满)。2.叶子节点全部在最底层
性质:
满二叉树在同样深度的二叉树中结点个数最多
满二叉树在同样深度的二叉树中叶子结点个数最多

对满二叉树结点位置进行编号:
编号规则:从根结点开始,自上而下,自左而右。
每一结点位置都有元素。

完全二叉树深度为k的具有n个结点的二叉树,当且仅当其每一个结点都与之深度为k的满二叉树编号为1 ~ n的结点一一对应时,称之为完全二叉树
特点
1.叶子只可能分布在层次最大的两层上。
2.对任一结点,如果其右子树的最大层次为i,则其左子树的最大层次必为i或i+1。

满二叉树一定是完全二叉树;完全二叉树不一定是满二叉树。

在这里插入图片描述

二叉树的性质

  • (1) 在非空二叉树中,第i层的结点总数不超过2^(i-1) , i>=1;
  • (2) 深度为k的二叉树最多有2^k-1 个结点(k>=1),最少有k个结点;
  • (3) 对于任意一棵二叉树,如果其叶结点数为N0,而度数为2的结点总数为N2,则N0=N2+1;
  • (4) 具有n个结点的完全二叉树的深度为 [log₂n]+1(注:[ x]表示向下取整,表示不大于x的最大整数)
  • (5) 有N个结点的完全二叉树各结点如果用顺序方式存储,则结点之间有如下关系:
    如果I=1,则结点i是二叉树的跟,无双亲;如果I>1,则其父结点的编号为I/2;
    如果 2 * I <= N,则其左孩子(即左子树的根结点)的编号为2 * I;若2 * I > N,则无左孩子;
    如果 2 * I+1 <= N,则其右孩子的结点编号为2 * I+1;若2 * I+1>N,则无右孩子。
  • (6) 给定N个结点,能构成h(N)种不同的二叉树。
    h(N)为卡特兰数的第N项。h(n)=C(2*n,n)/(n+1)。
  • (7) 设有i个枝点,I为所有枝点的道路长度总和,J为叶的道路长度总和J=I+2i [2]

树和二叉树的抽象数据类型定义

树的抽象数据类型定义:
在这里插入图片描述

在这里插入图片描述

二叉树的抽象数据类型定义:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

二叉树的存储结构

在这里插入图片描述

二叉树的顺序存储结构

实现:按满二叉树的结点层次编号,依次存放二叉树中的数据元素。

//二叉树顺序存储表示
#define MAXTSIZE 100  //二叉树的最大结点数
typedef TElemType SqBiTree[MAXTSIZE];//0号单元存储根结点//Binary Tree
SqBiTree bt;          //数组bt

在这里插入图片描述
在这里插入图片描述
二叉树顺序存储结构缺点:
最坏情况:深度为k的且只有k个结点的单只数需要长度为2^k-1的一维数组。
在这里插入图片描述
特点:结点空间关系蕴含在其存储位置中;浪费空间,适于存满二叉树和完全二叉树。

二叉树的链式存储结构

二叉链表

typedef struct BiTNode
{
   TElemType data;   //结点数据域
   struct BiTNode *lchild,*rchild; //左右孩子指针
}BiTNode,*BiTree;

二叉树结点的特点:
在这里插入图片描述

在这里插入图片描述
我们观察下二叉链表,给出一道思考题:

在n个结点的二叉链表中,有(n+1)个空指针域。

分析:n个结点必定有2n个链域。除根节点外,每个结点有且仅有一个双亲,所以只会有n-1个结点的链域存放指针,指向非空子女结点。
因此,空指针数目=2n-(n-1)= n +1

三叉链表

在这里插入图片描述

typedef struct TriTNode
{
	TelemType data;
	struct TriTNode *lchild,*parent,*rchild;
}TriTNode,*TriTree;

在这里插入图片描述

原创文章 50 获赞 139 访问量 2万+

猜你喜欢

转载自blog.csdn.net/diviner_s/article/details/105418851