1、采用书上第136页定义的树的孩子兄弟链表存储表示,编写递归算法实现树的下列基本操作。(1)构造树 (2)复制树 (3)销毁树 (4)先根遍历树 (5)清空树 (6)后根遍历树 (7)求树的深度 (8)求树的结点数 (9)求树的叶子结点数
2、采用书上第136页定义的树的孩子兄弟链表存储表示,编写非递归算法实现树的下列基本操作。(1)构造树 (2)先根遍历树 (3)后根遍历树 (4)层次遍历树 (5)求树的深度 (6) 求树的叶子结点数 (7)交换树的左右子树
10.1
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef struct CSNode
{
char data;
struct CSNode *firstchild, *nextsibing;
} CSNode, *CSTree;
int Nodenum = 0;
int Count = 0;
int CreatCSTree(CSTree &T)
{
char ch;
scanf("%c", &ch);
if (ch == '#')
T = NULL;
else
{
if (!(T = (CSTree)malloc(sizeof(CSNode))))
exit(OVERFLOW);
T->data = ch;
CreatCSTree(T->firstchild);
CreatCSTree(T->nextsibing);
}
return OK;
}
int PreOrderTraverse(CSTree T)
{
if (T)
{
printf("%c", T->data);
if (PreOrderTraverse(T->firstchild))
if (PreOrderTraverse(T->nextsibing))
return OK;
return ERROR;
}
else
return OK;
}
int PostOrderTraverse(CSTree T)
{
int m = 0;
if (T)
{
if (PostOrderTraverse(T->firstchild))
m = 1;
printf("%c", T->data);
if (m)
if (PostOrderTraverse(T->nextsibing))
return OK;
return ERROR;
}
else
return OK;
}
int CSTreeDepth(CSTree T)
{
int h1, h2;
if (T == NULL)
return 0;
else
{
h1 = CSTreeDepth(T->firstchild);
h2 = CSTreeDepth(T->nextsibing);
if (h1 + 1 >= h2)
return h1 + 1;
else
return h2;
}
}
int NodeCountCSTree(CSTree T)
{
if (T)
{
Nodenum++;
if (NodeCountCSTree(T->firstchild))
if (NodeCountCSTree(T->nextsibing))
return OK;
return ERROR;
}
else
return OK;
}
int LeafCountCSTree(CSTree T)
{
if (T)
{
if (T->firstchild == NULL && T->nextsibing == NULL)
{
printf("%c", T->data);
Count++;
}
if (LeafCountCSTree(T->firstchild))
if (LeafCountCSTree(T->nextsibing))
return OK;
return ERROR;
}
else
return OK;
}
int CopyCSTree(CSTree T, CSTree &B)
{
if (T == NULL)
B = NULL;
else
{
if (!(B = (CSTree)malloc(sizeof(CSNode))))
exit(OVERFLOW);
B->data = T->data;
CopyCSTree(T->firstchild, B->firstchild);
CopyCSTree(T->nextsibing, B->nextsibing);
}
return OK;
}
int DestroyCSTree(CSTree &T)
{
if (T)
{
DestroyCSTree(T->firstchild);
DestroyCSTree(T->nextsibing);
free(T);
}
return OK;
}
int ClearCSTree(CSTree T)
{
if (T)
{
T = NULL;
}
return OK;
}
int main()
{
CSTree T, B;
printf("创建树,按先序次序输入树中结点的值:\n");
CreatCSTree(T);
NodeCountCSTree(T);
printf("树的结点个数为:%d\n", Nodenum);
printf("树的深度为:%d\n", CSTreeDepth(T));
printf("先根遍历树,结果是:\n");
PreOrderTraverse(T);
printf("\n");
printf("后根遍历树,结果是:\n");
PostOrderTraverse(T);
printf("\n");
printf("输出树的叶子结点:\n");
LeafCountCSTree(T);
printf("\n");
printf("统计树的叶子结点个数:%d\n", Count);
if (CopyCSTree(T, B) == OK)
printf("成功复制树T到树B\n");
if (DestroyCSTree(T) == OK)
printf("成功销毁树T\n");
if (ClearCSTree(T) == OK)
printf("将树T置为空树\n");
printf("先根遍历树B,结果是:\n");
PreOrderTraverse(B);
printf("\n");
printf("后根遍历树B,结果是:\n");
PostOrderTraverse(B);
printf("\n");
}
10.2
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef struct CSNode
{
char data;
struct CSNode *firstchild, *nextsibing;
} CSNode, *CSTree;
struct c
{
CSTree p;
} s[100];
int Nodenum = 0;
int Count = 0;
int CreatCSTree(CSTree &T)
{
char ch;
scanf("%c", &ch);
if (ch == '#')
T = NULL;
else
{
if (!(T = (CSTree)malloc(sizeof(CSNode))))
exit(OVERFLOW);
T->data = ch;
CreatCSTree(T->firstchild);
CreatCSTree(T->nextsibing);
}
return OK;
}
int PreOrderTraverse(CSTree T)
{
int i = 0;
CSTree S;
s[0].p = T;
i++;
if (T)
while (i)
{
S = s[i - 1].p;
printf("%c", S->data);
i--;
if (S->nextsibing != NULL)
s[i++].p = S->nextsibing;
if (S->firstchild != NULL)
s[i++].p = S->firstchild;
}
printf("\n");
return 0;
}
int PostOrderTraverse(CSTree T)
{
int i = 0;
CSTree S;
CSTree pre;
S = T;
pre = NULL;
if (T)
while (S != NULL || i)
{
while (S != NULL)
{
s[i++].p = S;
S = S->firstchild;
}
if (i)
{
S = s[i - 1].p;
if (S->nextsibing == NULL || S->nextsibing == pre)
{
S = s[i - 1].p;
printf("%c", S->data);
i--;
pre = S;
S = NULL;
}
else
S = S->nextsibing;
}
}
printf("\n");
return 0;
}
int CSTreeDepth(CSTree T)
{
int leftdepth, rightdepth;
if (T == NULL)
return 0;
else
{
leftdepth = CSTreeDepth(T->firstchild);
rightdepth = CSTreeDepth(T->nextsibing);
if (leftdepth >= rightdepth)
return leftdepth + 1;
else
return rightdepth;
}
}
int NodeCountCSTree(CSTree T)
{
if (T)
{
Nodenum++;
if (NodeCountCSTree(T->firstchild))
if (NodeCountCSTree(T->nextsibing))
return OK;
return ERROR;
}
else
return OK;
}
int LeafCountCSTree(CSTree T)
{
if (T)
{
if (T->firstchild == NULL && T->nextsibing == NULL)
{
printf("%c", T->data);
Count++;
}
if (LeafCountCSTree(T->firstchild))
if (LeafCountCSTree(T->nextsibing))
return OK;
return ERROR;
}
else
return OK;
}
int CopyCSTree(CSTree T, CSTree &B)
{
if (T == NULL)
B = NULL;
else
{
if (!(B = (CSNode *)malloc(sizeof(CSNode))))
exit(OVERFLOW);
B->data = T->data;
CopyCSTree(T->firstchild, B->firstchild);
CopyCSTree(T->nextsibing, B->nextsibing);
}
return OK;
}
int DestroyCSTree(CSTree &T)
{
if (T)
{
DestroyCSTree(T->firstchild);
DestroyCSTree(T->nextsibing);
free(T);
}
return OK;
}
int ClearCSTree(CSTree &T)
{
if (T)
{
T = NULL;
}
return OK;
}
int main()
{
CSTree T, B;
printf("创建树,按先序次序输入树中结点的值:\n");
CreatCSTree(T);
NodeCountCSTree(T);
printf("树的结点个数为:%d\n", Nodenum);
printf("树的深度为:%d\n", CSTreeDepth(T));
printf("先根遍历树,结果是:\n");
PreOrderTraverse(T);
printf("\n");
printf("后根遍历树,结果是:\n");
PostOrderTraverse(T);
printf("\n");
printf("输出树的叶子结点:\n");
LeafCountCSTree(T);
printf("\n");
printf("统计树的叶子结点个数:%d\n", Count);
if (CopyCSTree(T, B) == OK)
printf("成功复制树T到树B\n");
if (DestroyCSTree(T) == OK)
printf("成功销毁树T\n");
if (ClearCSTree(T) == OK)
printf("将树T置为空树\n");
printf("先根遍历树B,结果是:\n");
PreOrderTraverse(B);
printf("\n");
printf("后根遍历树B,结果是:\n");
PostOrderTraverse(B);
printf("\n");
}