二叉树的遍历操作

一、操作要求

1.假设二叉树的结点值是字符,先根据输入一棵二叉树标明空子树的完整先根遍历序列或者根据输入一棵二叉树的先根遍历序列和中根遍历序列或者根据输入一棵二叉树的后根遍历序列和中根遍历序列,建立一棵以二叉链表表示的二叉树,并输出建立后的二叉树的先根、中根、后根遍历序列,观察其建立的二叉树是否正确;

2.复制上述建立的二叉树,并输出复制后的二叉树的后根遍历序列,观察其复制操作是否正确;

3.判断复制后形成的二叉树是否与原二叉树相等,如果相等,则报告“这两棵树是相等的,复制操作成功”,否则报告“这两棵树是不相等的,复制操作不成功”;

4.求出其中一棵树中叶子结点的个数并输出其值;

5.求出其中一棵树中的深度并输出其值;

6.输入一个指定的字符x,在指定的一棵二叉树中查找值为x的结点,如果查找成功,则输出“OK”,否则输出“ERROR”;

7.主程序中要求设计一个菜单,允许用户通过菜单来选择依次选择执行“建立一棵二叉树”、“复制二叉树”、“判断两棵二叉树相等”、“求二叉树的叶子结点个数”、“求二叉树的深度”和“查找”等操作。

二、代码实现

#include<stdio.h>
#include<malloc.h> 
#define OK 1
#define ERROR 0
typedef int Status;
typedef char TElemType;
typedef struct BiTNode
{
	TElemType data;
	struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

Status CreateBiTree(BiTree &T){
	TElemType ch;
	scanf("%c",&ch);
	if(ch=='#')
		T=NULL;
	else{
			T=(BiTree)malloc(sizeof(BiTNode));
			T->data=ch;
			CreateBiTree(T->lchild);
			CreateBiTree(T->rchild);
	}

return OK;
}
//标明空子树的完整先根遍历序列,建立二叉链表示二叉树 

Status CopyTree(BiTree T1,BiTree &T2){
	if(T1){
		T2=(BiTree)malloc(sizeof(BiTNode));
		if(!T2)	
			return ERROR;
		T2->data=T1->data;
		CopyTree(T1->lchild,T2->lchild);
		CopyTree(T1->rchild,T2->rchild);	
	}
	else
		T2=NULL;
	return OK;
} //复制 

Status IsEqual(BiTree T1,BiTree T2) {
	if(T1==NULL&&T2==NULL)
		return ERROR;
	if(T1!=NULL&&T2!=NULL)
		if(T1->data==T2->data)
			if(IsEqual(T1->lchild,T2->lchild));
				if(IsEqual(T1->rchild,T2->rchild));
					return OK;
	return ERROR;					
}//判断两棵树是否相等

int Countleaf(BiTree T,int &num){
	if(T!=NULL){
		if((T->lchild==NULL)&&(T->rchild==NULL))
			num++;
		Countleaf(T->lchild,num);
		Countleaf(T->rchild,num);	
	}
	return num;

} //求出叶子节点 

int Depth(BiTree T){
	int Depthleft,Depthright,h;
	if(T!=NULL){
		Depthleft=Depth(T->lchild);
		Depthright=Depth(T->rchild);
		h=1+(Depthleft>=Depthright?Depthleft:Depthright);
	} 
	else
		h=0;
	return h;	
}//求一棵树的深度 

Status SearchNode(BiTree &T,char x){
	if(T!=NULL){
		if(T->data==x)
			return OK;
		else
			return (SearchNode(T->lchild,x)!=ERROR?SearchNode(T->lchild,x):SearchNode(T->rchild,x));	
	}
	 return ERROR;
} //查找x值 

void PreRootTraverse(BiTree T){
	if(T!=NULL){
		printf("%c",T->data);
		PreRootTraverse(T->lchild);
		PreRootTraverse(T->rchild);
	}
}//先根遍历

void InRootTraverse(BiTree T){
	if(T!=NULL){
		InRootTraverse(T->lchild);
		printf("%c",T->data);
		InRootTraverse(T->rchild);
	}
}//中根遍历

void PostRootTraverse(BiTree T) {
	if(T!=NULL){
		PostRootTraverse(T->lchild);
		PostRootTraverse(T->rchild);
		printf("%c",T->data);
	}
}//后根遍历

int main(){
	BiTree T=NULL;
	BiTree T2=NULL;
	char x;
	int num=0;
	int a;
	
	while(1){
		printf("1--建立一棵二叉树\n");
		printf("2--复制二叉树\n");
		printf("3--判断两棵二叉树相等\n");
		printf("4--求二叉树的叶子结点个数\n");
		printf("5--求二叉树的深度\n");
		printf("6--查找\n");
		printf("请选择需要执行的功能(1-6):\n");
		scanf("%d",&a);
		switch(a){
			case 1:	
					printf("建立一棵二叉树\n");
					printf("请输入树中元素:(输入#为空)\n");
					getchar();//从键盘读入字符时,必须等到输入换行(按Enter键)才能读取
					CreateBiTree(T);
					printf("先根遍历为:");
					PreRootTraverse(T);
					printf("\n");
					printf("中根遍历为:");
					InRootTraverse(T);
					printf("\n");
					printf("后根遍历为:");
					PostRootTraverse(T); 
					printf("\n");
					break;
			case 2:
					CopyTree(T,T2);
					printf("复制后新二叉树的后根序列为:\n");
					PostRootTraverse(T2);
					printf("\n");
					break;
			case 3:
					if(IsEqual(T,T2)){
						printf("这两棵树是相等的,复制操作成功\n");
					}
					else
						printf("这两棵树是不相等的,复制操作不成功\n");
						printf("\n");
					break;
			case 4: 					
					printf("该二叉树叶子节点个数为:%d\n",Countleaf(T,num));
					printf("\n");
					break;
			case 5:
					printf("该二叉树的深度为:%d\n",Depth(T));
					break;
			case 6:
					printf("请输入要查找的字符x:\n");
					getchar(); 
					scanf("%c",&x);
					if(SearchNode(T,x)){
						printf("OK\n");
					}
					else
						printf("ERROR\n");
					break;
			case 7: return 0;
			default: printf("ERROR\n"); 									
		}
		printf("\n");
	} 
	return 1;
	}

三、运行结果

 

  • 11
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
以下是C语言实现先序创建和层序创建二叉链表的函数: ```c #include <stdio.h> #include <stdlib.h> typedef struct BiTNode { char data; struct BiTNode *lchild, *rchild; } BiTNode, *BiTree; // 先序创建二叉树 void CreateBiTree_Preorder(BiTree *T) { char ch; scanf("%c", &ch); if (ch == '#') { *T = NULL; } else { *T = (BiTree) malloc(sizeof(BiTNode)); (*T)->data = ch; CreateBiTree_Preorder(&(*T)->lchild); CreateBiTree_Preorder(&(*T)->rchild); } } // 层序创建二叉树 void CreateBiTree_Levelorder(BiTree *T) { char ch; BiTree queue[100]; int front = 0, rear = 0; scanf("%c", &ch); if (ch == '#') { *T = NULL; } else { *T = (BiTree) malloc(sizeof(BiTNode)); (*T)->data = ch; queue[rear++] = *T; while (front < rear) { BiTree p = queue[front++]; scanf("%c", &ch); if (ch == '#') { p->lchild = NULL; } else { p->lchild = (BiTree) malloc(sizeof(BiTNode)); p->lchild->data = ch; queue[rear++] = p->lchild; } scanf("%c", &ch); if (ch == '#') { p->rchild = NULL; } else { p->rchild = (BiTree) malloc(sizeof(BiTNode)); p->rchild->data = ch; queue[rear++] = p->rchild; } } } } // 中序遍历二叉树 void InOrderTraverse(BiTree T) { if (T != NULL) { InOrderTraverse(T->lchild); printf("%c ", T->data); InOrderTraverse(T->rchild); } } int main() { BiTree T; printf("请输入先序序列:"); CreateBiTree_Preorder(&T); printf("中序遍历结果:"); InOrderTraverse(T); printf("\n"); printf("请输入层序序列:"); CreateBiTree_Levelorder(&T); printf("中序遍历结果:"); InOrderTraverse(T); printf("\n"); return 0; } ``` 以下是创建的二叉树: ``` A / \ B C / \ D E ``` 执行程序测试二叉树遍历操作,输出结果如下: ``` 请输入先序序列:AB##C#D#E## 中序遍历结果:B A D C E 请输入层序序列:A#B#C#D#E## 中序遍历结果:B A D C E ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值