二叉树的先、中、后序遍历,左右子树互换,树的宽度求解

有关二叉树的其他基本功能下篇再更新。。。

#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define OVERFLOW -1
#define ERROR 0

typedef int Status;
typedef char TElemType;
typedef struct BiTNode{
	TElemType data;
	struct BiTNode *lchild,*rchild;
}BiTNode, *BiTree;


//创建
Status CreatBiTree(BiTree &T)
{
	char ch;
	scanf("%c",&ch);
	if(ch == '#')          //空树
		T = NULL;
	else{
		T = (BiTNode*)malloc(sizeof(BiTNode));
		if(!T)    exit(OVERFLOW);
		T->data = ch;               //生成根结点
		CreatBiTree(T->lchild);     //构造左子树
		CreatBiTree(T->rchild);     //构造右子树
	}
	return OK;
}

//先序遍历
Status PreOrderTraverse(BiTree T)
{
	if(T){
		printf("%c\t",T->data);
		PreOrderTraverse(T->lchild);
		PreOrderTraverse(T->rchild);
	}
	return OK;
}
 
 
//中序遍历
Status InOrderTraverse(BiTree T)
{
	if(T){
		InOrderTraverse(T->lchild );
		printf("%c\t",T->data);
		InOrderTraverse(T->rchild);
	}
	return OK;
}
 
 
//后序遍历
Status PostOrderTraverse(BiTree T)
{
	if(T){
		PostOrderTraverse(T->lchild);
		PostOrderTraverse(T->rchild);
		printf("%c\t",T->data);
	}
	return OK;
}

//测树的宽度
int Width(BiTree T)//求二叉树bt的最大宽度
{
	if (T==NULL) 
		return (0);  //空二叉树宽度为0
	else 
	{ 
	  BiTree Q[100],p;//Q是队列,元素为二叉树结点指针,容量足够大
      int front=1,rear=1,last=1;//front队头指针,rear队尾指针,last同层最右结点在队列中的位置
      int temp=0,maxw=0;       //temp记局部宽度, maxw记最大宽度
      Q[rear]=T;           //根结点入队列
      while(front<=last)
	  {
		  p=Q[front++]; 
		  temp++; //同层元素数加1
          if (p->lchild!=NULL)  Q[++rear]=p->lchild;   //左子女入队
		  if (p->rchild!=NULL)  Q[++rear]=p->rchild;   //右子女入队
		  if (front>last)      //一层结束, 
		  { 
			    last=rear;
				if(temp>maxw) maxw=temp;//last指向下层最右元素, 更新当前最大宽度
				temp=0;
		  }//if    
	  }//while
     return (maxw);
	}//结束width
}

//左右子树互换 
void ChangeLR(BiTree &T)
{
	BiTree temp;
	if(T->lchild==NULL&&T->rchild==NULL)
		return;
	else
	{
		temp = T->lchild;
		T->lchild = T->rchild;
		T->rchild = temp;
	}//交换左右孩子
	ChangeLR(T->lchild);  //递归交换左子树
	ChangeLR(T->rchild);  //递归交换右子树
}
 
 
//销毁
Status DestroyBiTree(BiTree &T)
{
	if(T){
			DestroyBiTree(T->lchild );
		
	
			DestroyBiTree(T->rchild );
	
	
			free(T);
	}
	return OK;
}
 
 
//打印
void PrintMenu(){
	printf("**********二叉树的应用*************\n");
	printf("*     1.创建二叉树                *\n");
	printf("*     2.先序遍历二叉树            *\n");
	printf("*     3.中序遍历二叉树            *\n");
	printf("*     4.后序遍历二叉树            *\n");
	printf("*     5.左右子树互换              *\n");
	printf("*     6.测得宽度                  *\n");
	printf("*     7.销毁二叉树                *\n");
	printf("*     0.退出                      *\n");
	printf("***********************************\n");
}
 
 
int main()
{
	int action;
	BiTree T;
	while(1){
		PrintMenu();
		fflush(stdin);
		printf("请输入指令:");
		scanf("%d",&action);
		fflush(stdin);
		switch(action)
		{
		case 1:system("cls");
               printf("请按先序遍历方式输入:");
			   CreatBiTree(T);
			   printf("二叉树创建成功!\n\n");
			break;
 
		case 2:system("cls");
			  printf("先序遍历二叉树:");
			  PreOrderTraverse(T);
			  printf("\n\n");
			break;
 
		case 3:system("cls");
			   printf("中序遍历二叉树:");
			   InOrderTraverse(T);
			   printf("\n\n");
			break;
 
		case 4:system("cls");
			   printf("后序遍历二叉树:");
			   PostOrderTraverse(T);
			   printf("\n\n");
			break;
 
		case 5:
        system("cls");
			  printf("左右子树互换:");
			  ChangeLR(T);
			  PreOrderTraverse(T);
			  printf("\n");
           break;
           
		case 6:
			int n;
			n=Width(T);
			printf("树的宽度: %d\n", n);
			break;
			
		case 7:system("cls");
			if(DestroyBiTree(T))
				   printf("二叉树销毁成功!!!\n");
			break;
			
		case 0:
			exit(1);break;
			
		default:
			system("cls");
			printf("输入命令错误!请重新输入:\n");
			break;
		}
	}
	return 0;
}

 

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值