本题代码如下
void swap(tree* t)
{
if (*t)// 如果当前节点非空
{
treenode* temp = (*t)->lchild;// 临时存储左子节点
(*t)->lchild = (*t)->rchild;// 将右子节点赋值给左子节点
(*t)->rchild = temp;// 将临时存储的左子节点赋值给右子节点
swap(&(*t)->lchild);// 递归交换左子树的左右子节点
swap(&(*t)->rchild);// 递归交换右子树的左右子节点
}
}
}
完整测试代码
#include<stdio.h>
typedef struct treenode
{
char data;
struct treenode* lchild, * rchild;
}treenode,*tree;
void buildtree(tree* t)
{
char ch;
ch = getchar();
if (ch == '#')
*t = NULL;
else
{
*t = (treenode*)malloc(sizeof(treenode));
(*t)->data = ch;
(*t)->lchild = NULL;
(*t)->rchild = NULL;
buildtree(&(*t)->lchild);
buildtree(&(*t)->rchild);
}
}
void swap(tree* t)
{
if (*t)
{
treenode* temp = (*t)->lchild;
(*t)->lchild = (*t)->rchild;
(*t)->rchild = temp;
swap(&(*t)->lchild);
swap(&(*t)->rchild);
}
}
void print(tree *t)
{
if (*t)
{
printf("%c ", (*t)->data);
print(&(*t)->lchild);
print(&(*t)->rchild);
}
}
int main()
{
tree t;
buildtree(&t);
printf("原有的前序序列为:");
print(&t);
swap(&t);
printf("\n交换后的前序序列为:");
print(&t);
return 0;
}
用ABD##E##CF##G##测试
/* A
B C
D E F G */
修改之后为
/* A
C B
G F E D */