7-8 交换二叉树中每个结点的左孩子和右孩子 (30分)
以二叉链表作为二叉树的存储结构,交换二叉树中每个结点的左孩子和右孩子。
输入格式:
输入二叉树的先序序列。
提示:一棵二叉树的先序序列是一个字符串,若字符是‘#’,表示该二叉树是空树,否则该字符是相应结点的数据元素。
输出格式:
输出有两行:
第一行是原二叉树的中序遍历序列;
第二行是交换后的二叉树的中序遍历序列。
输入样例:
ABC##DE#G##F###
输出样例:
CBEGDFA
AFDGEBC
#include<stdio.h>
#define N 100
typedef struct node
{
char data;
struct node *l;
struct node *r;
}*Bitree;
void inod(Bitree t);
void swapinod(Bitree t);
int main()
{
Bitree T,t;
T=t=(Bitree)malloc(sizeof(struct node));
Bitree stack[N];
int top=-1;
char a[N];
int i;
scanf("%s",a);
i=0;
if(a[i]=='#')
return 0;
t->data=a[i];
t->l=t->r=NULL;
i++;
stack[++top]=t;
while(top>=0)
{
if(a[i]!='#')
{
t=(Bitree)malloc(sizeof(struct node));
t->data=a[i];
t->l=t->r=NULL;
i++;
stack[top]->l=t;
stack[++top]=t;
}
if(a[i]=='#')
{
while(a[++i]=='#')
{
top--;//出栈
}
if(top<0)
{
break;
}
t=(Bitree)malloc(sizeof(struct node));
t->data=a[i];
t->l=t->r=NULL;
i++;
stack[top]->r=t;
top--;//出栈
stack[++top]=t;
}
}
inod(T);
printf("\n");
swapinod(T);
}
void inod(Bitree t)
{
if(t==NULL)
{
return;
}
inod(t->l);
printf("%c",t->data);
inod(t->r);
}
void swapinod(Bitree t)
{
if(t==NULL)
{
return;
}
swapinod(t->r);
printf("%c",t->data);
swapinod(t->l);
}
仅此纪念一下