版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/z861269429/article/details/51778635
给定树的孩子兄弟表示的数据类型如下
typedef char ElemType;
struct CSNode;
typedef struct CSNode * CSTree;
typedef struct CSNode CSTNode;
struct CSNode
{
ElemType data;
struct CSNode *child; //第一个孩子
struct CSNode *sibling; //下一个兄弟
};
树的创建I
完成CSTree CreateTree(char s[])函数,该函数由字符串s创建一颗树,其中字符串s是仅由‘(’、‘)’、‘,’以及大小写字符构成的树的广义表表示,如A(B(D,E,F),C(G)),字符串s以’\0’结尾。创建树时,下一兄弟链安装结点出现的顺序链接,如A(B(D,E,F),C(G))创建的树如下所示
CSTree NewNode(ElemType x)
{
CSTree p=(CSTree)malloc(sizeof(CSNode));
p‐>data=x;
p‐>child=NULL;
p‐>sibling=NULL;
return p;
}
CSTree CreateTree(char s[])
{
int i,k,top;
CSTree path[N],p,t;
k=0;
top=‐1;
for(i=0;s[i]!='\0';i++)
{
switch(s[i])
{
case '(':
path[++top]=p;
k=1;
break;
case ',':
k=2;
break;
case ')':
top‐‐;
break;
}
if(isalpha(s[i]))
{
p=NewNode(s[i]);
if(k==1)
path[top]‐>child=p;
else if(k==2)
{
t=path[top]‐>child;
while(t‐>sibling!=NULL)
t=t‐>sibling;
t‐>sibling=p;
}
}
}
return path[0];
}//2333
树的创建II
完成CSTree CreateTree(char s[])函数,该函数从标准输入创建一颗树。
创建树时,下一兄弟链安装结点出现的顺序链接,如输入样例创建的树如下所示
输入样列:
输入有多多行,表示树的广度优先遍历。输入样例表示如下所示的一颗树
A
BC#
DEF#
G#
#
#
#
#
CSTree NewNode(ElemType x)
{
CSTree p=(CSTree)malloc(sizeof(CSNode));
p‐>data=x;
p‐>child=NULL;
p‐>sibling=NULL;
return p;
}
CSTree CreateTree()
{
char a,s[N];
scanf("%c",&a);
getchar();
CSTree root=NewNode(a);
CSTree u,p,t;
queue<CSTree>q;
q.push(root);
while(!q.empty())
{
u=q.front();
q.pop();
fgets(s,N,stdin);
if(s[0]=='#')
continue;
p=NewNode(s[0]);
u‐>child=p;
q.push(p);
for(int i=1;s[i]!='#';i++)
{
p=NewNode(s[i]);
q.push(p);
t=u‐>child;
while(t‐>sibling!=NULL)
t=t‐>sibling;
t‐>sibling=p;
}
}
return root;
}
完成void Pre_Order(CSTree root)函数,该函按前序遍历的方式遍历树上的结点(下一兄弟中按顺序),如下图所示,前序遍历为ABDEFCG
void Pre_Order(CSTree root)
{
if(root!=NULL)
{
printf("%c",root‐>data);
if(root‐>child!=NULL)
Pre_Order(root‐>child);
if(root‐>sibling!=NULL)
Pre_Order(root‐>sibling);
}
}//2335
完成void Post_Order(CSTree root)函数,该函按前后遍历的方式遍历树上的结点(下一兄弟中按顺序),如下图所示,后序遍历为DEFBGCA
void Post_Order(CSTree root)
{
if(root!=NULL)
{
if(root‐>child!=NULL)
Post_Order(root‐>child);
printf("%c",root‐>data);
if(root‐>sibling!=NULL)
Post_Order(root‐>sibling);
}
}//2336