二叉树遍历

本文介绍了一个关于二叉树基本操作实现的实验任务,包括二叉树的创建、不同遍历方式(如先序、中序和后序遍历)的实现,并通过实例演示了如何计算二叉树的节点数及交换左右子树等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

16 学年—17学年第 1 学期 数据结构 实验任务书

专业名称:              实验学时:    2    

课程名称:数据结构      任课教师:  翟海霞     

实验题目: 二叉树的基本操作实现               

实验环境:    Visual C++ 6.0                    

实验目的:掌握二叉树的二叉链存储结构及表示。

          掌握二叉树的三种遍历算法(递归和非递归两类)。

          运用三种遍历的方法求解二叉树的有关问题。

实验内容:实现二叉树的二叉链表存储结构;

          实现先序、中序和后序遍历二叉树;

          遍历二叉树的应用:计算叶子结点、左右子树交换等。

 

要求:1、二叉树基本操作已实现,学习和进一步理解。

      2 、在求总结点的程序中加入求叶子结点的功能。

      3 、左右子树交换,按中序和后序是否也可以?

      4 、选作:按层遍历二叉树。

#include<stdio.h>
#include<stdlib.h>
#define MAX 100 
#include<queue>
#define OK 1;
char ch;
//二叉树存储结构
typedef struct BiTNode{
	char date;
	struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree; 
//创建二叉链表表示的二叉树
//Status CreateBiTree(BiTree &T)
void CreateBiTree(BiTree &T)
{
	scanf("%c",&ch);
	if(ch=='#')
	T=NULL;//递归结束,建立空树
	else
{	T=(BiTree)malloc(sizeof(BiTNode));//生成根节点
	T->date=ch;//根节点数据域置为ch
	CreateBiTree(T->lchild);
	CreateBiTree(T->rchild);
} 
 } 
 //先序遍历
 void PreTra(BiTree T)
 {
 	if(T)
 	{
 		printf("%c",T->date);
 		PreTra(T->lchild);
 		PreTra(T->rchild);
	 }
  } 
  //中序遍历
  void InTra(BiTree T)
  {
  	if(T)
  	{
  		InTra(T->lchild);
  		printf("%c",T->date);
  		InTra(T->rchild);
	  }
   }
   //后序遍历
   void  PostTra(BiTree T)
   {
   	if(T)
   	{
   		PostTra(T->lchild);
   		PostTra(T->rchild);
   		printf("%c",T->date);
	   }
   }
   //层序遍历
   void LevelTra(BiTree T)
   {
   	BiTree Q[MAX];
   	int front=0,rear=0;
   	BiTree p;
   	//根节点入队
	   if(T)
	   {
	   	Q[rear]=T;
	   	rear=(rear+1)%MAX;//插入节点为新的队尾元素 
		} 
   	while(front!=rear)
	   {
	   	//队头元素出队 
	   	p=Q[front];
	   	front=(front+1)%MAX; //删除头结点
		   printf("%c",p->date);
		   //左孩子不为空,入队
		   if(p->lchild)
		   {
		   	Q[rear]=p->lchild;
		   	rear=(rear+1)%MAX;//插入左孩子结点为新的队尾元素
			} 
			if(p->rchild)
			{
				Q[rear]=p->rchild;
				rear=(rear+1)%MAX;
			}
		} 
	} 	
  //计算节点数
  int NodeCount(BiTree T)
  {
  	if(T==NULL) return 0;
  	else
  	return NodeCount(T->lchild)+NodeCount(T->rchild)+1;
   }
   //交换左右子树
 void Exchange(BiTree &T)
{
	if(T){
	BiTree s;
	s=T->lchild;
	T->lchild=T->rchild;
	T->rchild=s;
	Exchange(T->lchild);
	Exchange(T->rchild);
	}
 } 
 //主菜单函数
 void menu()
 {
 
 	printf("1.建立二叉树\n");
 	printf("2.先序遍历二叉树\n");
	 printf("3.中序遍历二叉树\n");
	 printf("4.后序遍历二叉树\n");
	 printf("5.层序遍历\n");
	 printf("6.计算二叉树节点数\n");
	 printf("7.交换左右子树\n");
} 
//主函数 ABC##DE#G##F#### 
int main()
{
	printf("\n************************二叉树基本操作实现*******************\n\n");
	int n,num;
	BiTree T=NULL;
	menu();
while(1)
{ 
    printf("请输入你的选择:\n");
	scanf("%d",&n);	
	switch(n)
{
	case 1:{
		   printf("输入各元素,空子树用#表示:\n");
	       CreateBiTree(T);
	       printf("创建成功!\n\n");
		   }break; 
	case 2:{
		   printf("先序遍历:");
	       PreTra(T);printf("\n\n");
		   }break;
    case 3:{
    	   printf("中序遍历:");
           InTra(T);
		   printf("\n\n");
	       }break;
	case 4:{
	   	   printf("后序遍历:");
	       PostTra(T);
		   printf("\n\n");
	       }break;
	case 5:{
		   printf("层序遍历:");
	       LevelTra(T);
	       printf("\n\n");
	       }break;
	case 6:{
		   num=NodeCount(T);
	       printf("结点数为:%d",num);
	       printf("\n\n");
	       }break;
	case 7:{
		   printf("交换左右子树:");
	       Exchange(T);
	       printf("交换成功!\n\n");
	       }break;
	case 0:exit(0); 
	default: printf("无效输入!\n\n");   
}
}
return 0;
} 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值