C语言实现二叉树左右子树的交换:
代码解释:
创建树:
1> 首先声明一个根结点bt,给系统输入一个字符,并进行,如果字符是'#',则返回NULL;
2> 如果字符不是'#',则给根结点建立建立结点,并将刚输入的字符赋给该结点的数据域 ch ,之后将这个结点的的递归调用下一个结点赋给这个结点的左子树;
3> 如果遇到输入的值为'#'时,这一次递归调用结束,返回上一层递归调用,接着继续执行循环将这一次结点的递归调用;
4> 如果遇到不是'#'就继续执行第2步,遇到'#'返回NULL,直到输入完所要创建的结点,并将根结点bt返回到main函数,再按回车就会执行出结果;
交换操作:
1> 首先进行判断,只要这个结点不为根结点,就会进行判断;
2> 从根结点开始,访问一个结点就会交换结点的左右子树;
3> 之后判断交换后的左右子树是否为空,如果左子树不为空,继续访问这个结点的左子树,进行递归调用,重复上述步骤;
4> 如果为空,判断这个结点的右子树是否为空,不为空,进行递归调用,为空的话结束交换Exchange函数,返回上一层递归调用;
5> 知道访问完所有结点返回main函数,进行其他操作;
#include<stdio.h>
#include<stdlib.h>
//二叉树的结点类型;
typedef struct tree
{
char ch;
struct tree *lchild;
struct tree *rchild;
}BitTree;
//创建树;
BitTree *CreateTree()
{
BitTree *bt;
char str;
scanf("%c",&str);
if(str=='#')
return NULL;
else
{
bt=(BitTree *)malloc(sizeof(BitTree));
bt->ch=str;
bt->lchild=CreateTree();
bt->rchild=CreateTree();
return bt;
}
}
//交换左右二叉树;
void Exchange(BitTree *bt)
{
if(bt->lchild==NULL&&bt->rchild==NULL)
;
else //三种情况,1.都不为空,2.左为空,3.右为空;
{
//交换左右子树;
BitTree *temp=bt->lchild;
bt->lchild=bt->rchild;
bt->rchild=temp;
}
//如果交换后的这个结点左子树不为空,则继续向下寻找可以交换的结点;
if(bt->lchild)
Exchange(bt->lchild);
if(bt->rchild)
Exchange(bt->rchild);
}
//先序输出交换后的二叉树;
void PreOrder(BitTree *bt)
{
if(bt!=NULL)
{
printf("%c ",bt->ch);
PreOrder(bt->lchild);
PreOrder(bt->rchild);
}
}
//中序输出交换后的二叉树;
void InOrder(BitTree *bt)
{
if(bt!=NULL)
{
InOrder(bt->lchild);
printf("%c ",bt->ch);
InOrder(bt->rchild);
}
}
//后序输出交换后的二叉树;
void PostOrder(BitTree *bt)
{
if(bt!=NULL)
{
PostOrder(bt->lchild);
PostOrder(bt->rchild);
printf("%c ",bt->ch);
}
}
int main(void)
{
BitTree *bt;
//创建二叉树;
printf("请以先序序列输入需要交换的二叉树:\n");
bt=CreateTree();
//交换左右子树;
Exchange(bt);
//先序输出;
printf("交换后以先序序列输出:\n");
PreOrder(bt);
printf("\n");
//中序输出;
printf("交换后以中序序列输出:\n");
InOrder(bt);
printf("\n");
//后序输出;
printf("交换后以后序序列输出:\n");
PostOrder(bt);
printf("\n");
return 0;
}
输出结果截图: