“抽象”《大话数据结构》第六章——树(概念部分)

树的定义

树也是有限结点(n个)的集合,有如下特点:
1 n = 0时,树成为空树
2 n > 1时,树可以分为更多不相交的子树
3 一棵树的根是唯一的
4 子树的个数没有限制,但是必须各个子树互不相交

我们也给树的结点分了类别:
首先我们需要知道,结点拥有的子树的数目,称为结点的度。这样就可以按照度来进行分类了。
1 叶子,度为零的结点称为叶子,在树的最末端。
2 分支结点,度不为零的结点,称为分支结点,又称内部结点。
度还有一个作用就是:在一棵树里面,某一结点度的值最大,那么这个度也就代表了整棵树的度。

分好类别后,开始研究各个结点之间的关系:
按照树的图形表达,上一级的结点是下一级的双亲,这样下一级结点也就是上一级的孩子了,同一个上一级结点的孩子可能有多个,他们就是兄弟关系。

从各个结点的关系可以看出:
双亲生的孩子又可以生孩子,成为双亲。这样就发展了三代,这个代数在树的定义里面叫做树的深度。
两棵以上的树,就可以称作森林了。

树的抽象数据类型

数据类型:
由结构体构成,包含数据域与指针域,指针域完成了与各个结点的关系连接。
操作类型:
1 建立树T,销毁树T。
2 返回树的深度,返回根结点。
3 查找双亲,查找孩子
4 插入结点作为孩子,删除结点

树的存储结构

由于树是一对多的结构,单纯使用顺序存储结构,很难表示各个结点的关系;单纯使用链式存储结构,对于查找,插入,删除都十分不便,所以将顺序存储结构和链式存储结构结合起来才是正解。

双亲表示法

核心思想:每个结点都有双亲,且唯一。
所以每个结点具有数据域和指针域两个部分(由于树每个结点都是存储在数组内,所以这里的指针域其实是一个整型变量,类似指针的功能)
数据域:存储数据的部分
指针域:

  1. parent指针,存储该结点的双亲下标,没有双亲,就赋为 -1,它就是树的根。
  2. firstchild指针,存储该结点的最左边的孩子,长子。
  3. rightbro指针:存储该结点的有兄弟,就是紧靠它右边的那位。
 #define SZIE 100
typedef int TElemType;
typedef struct PTnode
{
	TElemType data;
	int parent;
	int fistchild;
	int rightbro;
}PTnode;
typedef struct
	{
		PTnode nodes[SIZE];
		int root_loca,num_of_node;
	}PTree;

孩子表示法

核心思想:每个结点都有多个孩子。
首先该棵树所有结点都存储在数组里,该结点有数据域和指针域。
数据域:存储结点的数据。
指针域:存储当前结点的孩子构成的单链表的第一个结点,当前结点就是孩子链表的头结点啦。
没有孩子,指针域指向NULL。

孩子链表的结点也分为数据域和指针域:
数据域:孩子在数组的下标
指针域:指向当前孩子右边的孩子,如果右边没有孩子了,则指向空。

typedef struct Childnode
{
	int data;
	struct Childnode *nextchild;
}*child_Ptr;
typedef struct Tree_node
{
	TElemType data;
	child_Ptr firstchild;
}Tnode;
typedef struct Tree_node
	{
		Tnode TREE[SIZE];
		int root_loca,num_of_node;
	}TREE;

孩子兄弟表示法

核心思想:在一棵树里面,任何一个结点,如果它存在第一个孩子(长子)就是唯一,如果这个结点存在右兄弟,那也是唯一的。
结点的数据类型为:数据域和指针域。
数据域:存储结点数据
指针域:firstchild指针,存储当前结点的长子下标,rightbro指针存储当前结点的右兄弟的下标。还可以增加一个parent指针,存储当前结点的双亲下标。若是不存在,则这三类指针,指向NULL。

二叉树的定义

孩子兄弟表示法,就是二叉树的思想。
二叉树是树的一种,故它也是有限个结点(n)的集合,如果n = 0,则称为空树。它还具有如下特点:

  1. 每个结点最多有两棵子树
  2. 左子树和右子树是有顺序的,次序不能任意颠倒
  3. 即使某一结点只有一棵子树,它还是要区分左右子树。

斜树

所有的结点只有左子树或者右子树,只有左子树的叫做左斜树,只有右子树的叫做右斜树。

满二叉树

在一棵二叉树中,所有的内部结点都有左子树和右子树,并且所有的叶子都在同一层上,这就是满二叉树。

完全二叉树

我的理解就是,在满二叉树的基础上,从右往左不间隔的少了叶子。它是完全的二叉树,但是没有满。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值