第六章 樹和二叉樹
int Is_Descendant_C(int u
{
if(u==v) return
else
{
if(L[v])
if (Is_Descendant(u
if(R[v])
if (Is_Descendant(u
}
return
}//Is_Descendant_C
int Is_Descendant_P(int u
{
for(p=u;p!=v&&p;p=T[p]);
if(p==v) return
else return
}//Is_Descendant_P
這一題根本不需要寫什麼算法
int Bitree_Sim(Bitree B
{
if(!B
else if(B
return
else return
}//Bitree_Sim
void PreOrder_Nonrecursive(Bitree T)//先序遍歷二叉樹的非遞歸算法
{
InitStack(S);
Push(S
while(!StackEmpty(S))
{
while(Gettop(S
{
visit(p
push(S
} //向左走到盡頭
pop(S
if(!StackEmpty(S))
{
pop(S
push(S
}
}//while
}//PreOrder_Nonrecursive
typedef struct {
BTNode* ptr;
enum {
} PMType; //有mark域的結點指針類型
void PostOrder_Stack(BiTree T)//後續遍歷二叉樹的非遞歸算法
{
PMType a;
InitStack(S); //S的元素為PMType類型
Push (S
while(!StackEmpty(S))
{
Pop(S
switch(a
{
case
Push(S
if(a
break;
case
Push(S
if(a
break;
case
visit(a
}
}//while
}//PostOrder_Stack
分析:為了區分兩次過棧的不同處理方式
typedef struct {
int data;
EBTNode *lchild;
EBTNode *rchild;
EBTNode *parent;
enum {
} EBTNode
void PostOrder_Nonrecursive(EBitree T)//後序遍歷二叉樹的非遞歸算法
{
p=T;
while(p)
switch(p
{
case
p
if(p
break;
case
p
if(p
break;
case
visit(p);
p
p=p
}
}//PostOrder_Nonrecursive
分析:本題思路與上一題完全相同
typedef struct {
int data;
PBTNode *lchild;
PBTNode *rchild;
PBTNode *parent;
} PBTNode
void Inorder_Nonrecursive(PBitree T)//不設棧非遞歸遍歷有雙親指針的二叉樹
{
p=T;
while(p
while(p)
{
visit(p);
if(p
{
p=p
while(p
}
else if(p
else
{
p=p
while(p
p=p
} //當自己是雙親的右孩子時後繼就是向上返回直到遇到自己是在其左子樹中的祖先
}//while
}//Inorder_Nonrecursive
int c
void Get_PreSeq(Bitree T)//求先序序列為k的結點的值
{
if(T)
{
c++; //每訪問一個子樹的根都會使前序序號計數器加
if(c==k)
{
printf(
exit (
}
else
{
Get_PreSeq(T
Get_PreSeq(T
}
}//if
}//Get_PreSeq
main()
{
scanf(
c=
Get_PreSeq(T
}//main
int LeafCount_BiTree(Bitree T)//求二叉樹中葉子結點的數目
{
if(!T) return
else if(!T
else return Leaf_Count(T
}//LeafCount_BiTree
void Bitree_Revolute(Bitree T)//交換所有結點的左右子樹
{
T
if(T
if(T
}//Bitree_Revolute
int Get_Sub_Depth(Bitree T
{
if(T
{
printf(
exit
}
else
{
if(T
if(T
}
}//Get_Sub_Depth
int Get_Depth(Bitree T)//求子樹深度的遞歸算法
{
if(!T) return
else
{
m=Get_Depth(T
n=Get_Depth(T
return (m>n?m:n)+
}
}//Get_Depth
void Del_Sub_x(Bitree T
{
if(T
else
{
if(T
if(T
}//else
}//Del_Sub_x
void Del_Sub(Bitree T)//刪除子樹T
{
if(T
if(T
free(T);
}//Del_Sub
void Bitree_Copy_Nonrecursive(Bitree T
{
InitStack(S
push(S
U=(BTNode*)malloc(sizeof(BTNode));
U
q=
From:http://tw.wingwit.com/Article/program/sjjg/201311/23564.html