cADT树(tree)
Data树是由一个根结点和若干棵子树构成。树中结点具有相同数据类型及层次关系。
Operation
InitTree(*T):构造空树T。
DestroyTree(*T):销毁树T。
CreateTree(*T,definition):按definition中给出树的定义来构造树。
ClearTree(*T):若树T存在,则将树T清为空树。
TreeEmpty(T):若T为空树,返回true,否则返回false。
Treepepth(T):返回T的深度。
Root(T):返回T的根结点。
Value(T,cur_e):cur_e是树T中一个结点,返回此结点的值。
Assign(T,cur_e,value):给树T的结点cur_e赋值为value。
Parent(T,cur_e):若cur_e是树T的非根结点,则返回它的双亲,否则返回空。
Leftchild(T,cur_e):若cur_e是树T的非叶结点,则返回它的最左孩子,否则返回空。
RightSibling(T,cur_e):若cur_e有右兄弟,则返回它的右兄弟,否则返回空。
InsertChild(*T,*p,i,c):其中p指向树T的某个结点,i为所指结点p的度加上1,非空树c与T不相交,操作结果为插入c为树T中p指结点的第棵子树。
Deletechild(*T,*p,i):其中p指向树T的某个结点,i为所指结点p的度,操作结果为删除T中p所指结点的第i棵子树。
endADT
在每个结点中,附设一个指示器指示其双亲结点到链表中的位置
这种设置,我们可以很快找到结点的根节点,但是想要找到子结点,只能通过遍历整个结构,所以为了解决该问题,可以为其结点增加长子域,右兄弟域等等
每个结点设置多个指针域,其中每个指针指向一颗子树有的根节点,我们吧这种方法叫做多重链表表示法
由于树的每个结点的度是不同的,所以有以下两种方案来解决
用树的度作为作为指针域的大小去构建结点(树的度:树内各结点的度的最大值)
以这种方案去构建,当树内各个结点的度相差比较远的时候,会造成空间浪费,相反,当树内各个结点的度相差比较小的时候,则该存储结构有更高的优势(减少运算)
每个结点指针域的个数等于该结点的度,用一个位置来存储结点指针域的个数
这种方法克服了浪费空间的缺点,对空间利用率提高了,但是由于各个结点的链表结构式不同的,加上要维护结点的度的数值,运算上会带来时间上的损耗
把每个结点的孩子结点排列起来,以单链表作存储结构,则 n 个结点有 n 个孩子链表,如果叶子结点则此单链表为空。然后 n 个头指针又组成一个线性表,采用顺序存储结构,存放进一个一维数组中
孩子表示法对于查找孩子的双亲比较麻烦,于是结合孩子标识法和双亲表示法,构建一个双亲孩子表示法
在孩子表示法中增加存放双亲结点指针的指针域
二叉树是 n ( n >= 0 ) 个结点的有限集合,改集合或者为空集(称为空二叉树),或者由一个根结点和两颗互不想交的、分别称为根结点的左子树和右子树的二叉树组成
特点:
形态:
所有的结点都只有左子树的二叉树叫左斜树。所有结点都是只有右子树的二叉树叫右斜树。这两者统称为斜树。
在一颗二叉树中,如果所有分支结点都存在左子树和右子树,并且所以叶子都在同一层中
对一棵具有 n 个结点的二叉树按层序编号,如果编号为 i(1 < i < n)的结点与同样深度的满二又树中编号为i的结点在二又树中位置完全相同,则这棵二叉树称为完全二叉树
性质1:
性质2:
性质3:
性质4:
性质5:
二叉树的遍历是指从根结点出发,按照某种次序依次访问二叉树中所有结点,使得每个结点被访问一次且仅被访问一次
规则是若二叉树为空,则空操作返回,否则先返回根结点,然后前序遍历左子树,再遍历右子树。上图的前序遍历顺序为:ABDGHCEIF
规则是若二叉树为空,则空操作返回,否则从根结点开始(注意并不是先访问根节点),中序遍历根节点的左子树,然后访问根结点,最后中序遍历右子树。上图的中序遍历顺序为:GDHBAEICF
规则是若二叉树为空,则空操作返回,否则从左到右先叶子后结点的方式遍历左右子树,最后访问根节点。上图的后续遍历顺序为:GHDBIEFCA
规则是若二叉树为空,则空操作返回,否则从树的第一层,也就是根节点开始访问,冲上而下逐层遍历,在同一层中,按从左到右的顺序对结点逐个访问。上图的层序遍历顺序为:ABCDEFGHI
与二叉树的遍历一致
这种指向前驱和后继的指针称为线索,加上线索的二叉链表称为线索链表,相应的二又树就称为线索二又树(Threaded Binary Tree)。
使为空的左孩子指针指向该结点的前驱,为空的右孩子指针指向该结点的后继;并设置标记,ltag 和 rtag ,为 0时指向孩子,为 1 时指向前驱、后继。(主要是为了充分利用空指针域)
步骤:
树:
graph TB;
1((A)) --- 2((B))
1((A)) --- 3((C))
1((A)) --- 4((D))
2((B)) --- 5((E))
2((B)) --- 6((F))
2((B)) --- 7((G))
3((C)) --- 8((H))
4((D)) --- 9((I))
4((D)) --- 10((J))
变化过程-连线:
graph TB;
1((A)) --- 2((B))
1((A)) --- 3((C))
1((A)) --- 4((D))
2((B)) --- 5((E))
2((B)) --- 6((F))
2((B)) --- 7((G))
3((C)) --- 8((H))
4((D)) --- 9((I))
4((D)) --- 10((J))
2 -.- 3
3 -.- 4
5 -.- 6
6 -.- 7
9 -.- 10
变化过程-删除连线:
graph TB;
1((A)) --- 2((B))
2((B)) --- 5((E))
3((C)) --- 8((H))
4((D)) --- 9((I))
2 -.- 3
3 -.- 4
5 -.- 6((F))
6 -.- 7((G))
9((I)) -.- 10((J))
步骤:
步骤:
判断一棵二又树能够转换成一棵树还是森林,标准很简单,那就是只要看这棵二又树的根结点有没有右孩子,有就是森林,没有就是一棵树。那么如果是转换成森林,步骤如下:
本文作者:Yui_HTT
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!