C语言实现交换二叉树左右子树

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;
}

        输出结果截图:


  • 49
    点赞
  • 271
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值