二叉树的相关操作
用递归的方法实现二叉树的操作:
(1)以二叉链表表示二叉树,建立一棵二叉树(算法 5.3);
(2)输出二叉树的中序遍历结果(算法 5.1);
(3)输出二叉树的前序遍历结果(见讲稿);
(4)输出二叉树的后序遍历结果(见讲稿);
(5)计算二叉树的深度(算法 5.5);
(6)统计二叉树的结点个数(算法 5.6);
(7)统计二叉树的叶结点个数;
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
typedef char TElemType;
#define OVERFLOW -1
using namespace std;
typedef struct BiNode{
TElemType data;
struct BiNode *lchild,*rchild; //左右孩子指针
}BiNode,*BiTree;
BiTree CreatBiTree(); //创建二叉树的函数
void PreOrderTraverse(BiTree T);
void InOrderTraverse(BiTree T);
void PostOrderTraverse(BiTree T);
int LeafCount(BiTree T);
int NodeCount(BiTree T);
int Depth(BiTree T);
void main()
{
BiTree T=NULL;
int a;
int b; //ch1用来控制子系统界面是否一直出现,ch2用来选择具体的操作
while(b)
{ printf("\n");
printf("\n\t\t 二叉树基本操作");
printf("\n\t\t*******************************************");
printf("\n\t\t* 1------建二叉树 *");
printf("\n\t\t* 2------中序遍历 *");
printf("\n\t\t* 3------前序遍历 *");
printf("\n\t\t* 4------后序遍历 *");
printf("\n\t\t* 5------二叉树深度 *");
printf("\n\t\t* 6------二叉树结点个数 *");
printf("\n\t\t* 7------二叉树叶结点个数 *");
printf("\n\t\t* 0------返 回 *");
printf("\n\t\t*******************************************");
printf("\n\t\t 请选择菜单号(0--7):");
scanf("%d",&a);
getchar();
printf("\n");
switch(a)
{ case 1:
printf("\n\t\t 请按先序序列输入二叉树的结点,输入结点后按回车键\n");
printf("\n\t\t '#'表示后继结点为空。\n");
printf("\n\t\t 请输入根结点:");
T=CreatBiTree();
printf("\n\t\t 二叉树成功建立!\n");
break;
case 2:
printf("\n\t\t 二叉树的中序遍历序列为: ");
InOrderTraverse(T);
break;
case 3:
printf("\n\t\t 二叉树的先序遍历序列为: ");
PreOrderTraverse(T);
break;
case 4:
printf("\n\t\t 二叉树的后序遍历序列为: ");
PostOrderTraverse(T);
break;
case 5:
printf("\n\t\t 二叉树的深度是:%d\n",Depth(T));
break;
case 6:
printf("\n\t\t 二叉树总共有 %d 个结点。\n",NodeCount(T));
break;
case 7:
printf("\n\t\t 二叉树有 %d 个叶子结点。\n",LeafCount(T));
break;
case 0:
b=0;
break;
default:
printf("输入数据错误!");
}
}
}
BiTree CreatBiTree() //建二叉树
{
BiTree T; // 定义一个二叉树指针变量
char x;
scanf("%c",&x); //x用来存放输入的字符数据
getchar();
if(x=='#')
T=NULL;
else
{
T=(BiNode *)malloc(sizeof(BiNode)); //申请一个二叉树结点的空间
if(!T){ printf("空间分配失败!\n"); exit(OVERFLOW);}
T->data=x; //输入的数据赋给结点的数据域,生成根结点
printf("\n\t\t 请输入 %c 结点的左子结点:",T->data);
T->lchild=CreatBiTree(); //递归创建左子树
printf("\n\t\t 请输入 %c 结点的右子结点:",T->data);
T->rchild=CreatBiTree();//递归创建右子树
}
return T;
}
void PreOrderTraverse(BiTree T) //先序遍历
{
if(T)
{ printf("%3c",T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
void InOrderTraverse(BiTree T) //中序遍历
{
if(T)
{ InOrderTraverse(T->lchild );
printf("%3c",T->data);
InOrderTraverse(T->rchild);
}
}
void PostOrderTraverse(BiTree T) //后序遍历
{
if(T)
{ PostOrderTraverse(T->lchild );
PostOrderTraverse(T->rchild);
printf("%3c",T->data);
}
}
int LeafCount(BiTree T)
{ //求叶子数
if(T==NULL) //如果是空树返回0
return 0;
if (T->lchild == NULL && T->rchild == NULL)
return 1; //如果是叶子结点返回1
else return LeafCount(T->lchild) + LeafCount(T->rchild);
}
int NodeCount(BiTree T){ //求结点数
if(T == NULL ) return 0; //空树结点个数为0
else return NodeCount(T->lchild)+NodeCount(T->rchild)+1;//否则结点个数为左子树的结点个数+右子树的结点个数
}
int Depth(BiTree T) 计算二叉树T的深度
{
int m,n;
if(T==NULL)
return 0; //如果是空树,深度为0,递归结束
else
{
m=Depth(T->lchild);//递归计算左子树的深度记为m
n =Depth(T->rchild);//递归计算右子树的深度记为n
if(m>n)
return m+1; //二叉树的深度为m与n较大者加1
else
return n+1;
}
}
`