数据结构(C语言版)摘录--树和二叉树


第六章 树和二叉树


树(Tree)是n(n>=0)个结点的有限集。在任意一棵非空树中:(1)有且仅有一个特定的称为根(Root)的结点;(2)当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1,T2,。。。,Tm,其中每一个集合本身又是一棵树,并且称为根的子树(SubTree)。

森林(Forest)是m(m>=0)棵互不相交的树的集合。对树中每个结点而言,其子树的集合即为森林。

二叉树(Binary Tree)是另一种树型结构,它的特点是每个结点至多只有两棵子树(即二叉树中不存在度大于2的结点),并且,二叉树有左右之分,其次序不能任意颠倒。

数据结构(C语言版)摘录--树和二叉树_第1张图片


线索二叉树:

当以二叉链表作为存储结构时,只能找到结点的左、右孩子信息,而不能直接得到结点在任一序列中的前驱和后继信息,这种信息只有在遍历的动态过程中才能得到。试做如下规定:若结点有左子树,则其lchild域指示其左孩子,否则令lchild域指示其前驱;若结点有右子树,则其rchild域指示其右孩子,否则令rchild域指示其后继。为了避免混淆,尚需改变结点结构,增加两个标志域。

其中:
LTag= 0(lchild域指示结点的左孩子);1(lchild域指示结点的前驱)
RTag=0(rchild域指示结点的右孩子);1(rchild域指示结点的后继)
以这种结点结构构成的二叉链表作为二叉树的存储结构,叫做线索链表,其中指向结点前驱和后继的指针,叫做线索。加上线索的二叉树称之为线索二叉树(Threaded Binary Tree)。对二叉树以某种次序遍历使其变为线索二叉树的过程叫做线索化。
在线索树上进行遍历,只要先找到序列中的第一个结点,然后依次找结点后继直至其后继为空时为止。从而简化了遍历的算法。

中序线索树的遍历算法:

中序遍历的第一个结点:左子树上处于“最左下”(没有左子树)的结点。
在中序线索树中找结点后继:若无右子树,则为后继线索所指结点;否则为对其右子树进行中序遍历时访问的第一个结点,即右子树中最左下的结点。
在中序线索树中找结点前驱:若无左子树,则为前驱线索所指结点;否则遍历左子树时最后访问的一个结点(左子树中最右下的结点)为其前驱。


树的存储结构

1.双亲表示法

数据结构(C语言版)摘录--树和二叉树_第2张图片
r:根结点的位置。  
n:结点个数。

2.孩子表示法

数据结构(C语言版)摘录--树和二叉树_第3张图片


3.孩子兄弟表示法

又称为二叉树表示法,或二叉链表表示法。即以二叉链表作为树的存储结构。链表中结点的两个链域分别指向该结点的第一个孩子结点和下一个兄弟结点,分别命名为firstchild域和nextsibling域。
数据结构(C语言版)摘录--树和二叉树_第4张图片
//- - - - 树的二叉链表(孩子-兄弟)存储表示 - - - -
typedef struct CSNode{
ElemType       data;
struct CSNode  *firstchild, *nextsibling;
}CSNode, *CSTree;


由于二叉树和树都可用二叉链表作为存储结构,则以二叉链表作为媒介可导出树和二叉树之间的一个对应关系。也就是说, 给定一棵树,可以找到惟一的一棵二叉树与之对应,从物理结构来看,它们的二叉链表是相同的,只是解释不同而已。

树和森林的遍历

树的遍历

  • 先根(次序)遍历:若树不空,则先访问根结点,然后依次先根遍历各棵子树。
  • 后根(次序)遍历:若树不空,则先依次后根遍历各棵子树,然后访问根结点。
  • 按层次遍历:若树不空,则自上而下自左至右访问树中每个结点。
数据结构(C语言版)摘录--树和二叉树_第5张图片

森林的遍历

数据结构(C语言版)摘录--树和二叉树_第6张图片

1.先序遍历森林

若森林非空,则可按下述规则遍历之:
(1)访问森林中第一棵树的根结点;
(2)先序遍历第一棵树中根节点的子树森林;
(3)先序遍历森林中除去第一棵树之外其余树构成的森林。
即:依次从左至右对森林中的每一棵树进行先根遍历。

2.中序遍历森林

若森林非空,则可按下述规则遍历之:
(1)中序遍历森林中第一棵树的根结点的子树森林;
(2)访问第一棵树的根结点;
(3)中序遍历除去第一棵树之后剩余的树构成的森林。
即:依次从左至右对森林中的每一棵树进行后根遍历。

数据结构(C语言版)摘录--树和二叉树_第7张图片



你可能感兴趣的:(数据结构,c,算法,tree,存储,语言)