二叉树的基本操作实现

时间:2021-06-23 17:34:04

二叉树的基本操作实现 二叉树的基本操作实现 二叉树的基本操作实现

<span style="font-size:18px;"><span style="font-size:18px;">#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define PF printf("\n")
int m,n,max;
typedef struct BiTNode
{
int data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;//定义二叉树

//创建二叉树 (按照前序顺序输入)
void CreateBiTree(BiTree &T)
{
int temp;
scanf("%d",&temp);
if(temp==-1)
T=NULL;
else
{
T=new BiTNode;
T->data=temp;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}

//二叉树遍历,先序遍历
void PreOrderTraverse(BiTree &T)
{
if(T)
{
printf("%d ",T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}

//二叉树中序遍历
void InOrderTraverse(BiTree &T)
{
if(T)
{
InOrderTraverse(T->lchild);
printf("%d ",T->data);
InOrderTraverse(T->rchild);
}
}

//二叉树后序遍历
void PosOrderTraverse(BiTree &T)
{
if(T)
{
PosOrderTraverse(T->lchild);
PosOrderTraverse(T->rchild);
printf("%d ",T->data);
}
}

//计算结点的个数
int NodeCount(BiTree T)
{
if(T==NULL)
return 0;
else
return NodeCount(T->lchild)+NodeCount(T->rchild)+1;
}

//计算叶子节点的个数
int CountLeaves(BiTree T)
{
if(T==NULL)
return 0;
if(T->lchild==NULL&&T->rchild==NULL)
return 1;
else
return CountLeaves(T->lchild)+CountLeaves(T->rchild);
}
int Depth(BiTree T)
{
if(T==NULL)
return 0;
m=1,n=1;
m+=Depth(T->lchild);
n+=Depth(T->rchild);
if(m>n)
return m;
else
return n;
}

//交换左右子树
BiTree Exchange(BiTree &T)
{
BiTree p;
if(T==NULL||(T->lchild==NULL&&T->rchild==NULL))
return T;
p=T->lchild;
T->lchild=T->rchild;
T->rchild=p;
if(T->lchild)
T->lchild=Exchange(T->lchild);
if(T->rchild)
T->rchild=Exchange(T->rchild);
return T;
}
int main()
{
BiTree T;
T=NULL;
while(1)
{
PF;PF;PF;
printf("\t\t1、按照前序顺序的方式输入\n");
printf("\t\t2、按照前序遍历方式遍历\n");
printf("\t\t3、按照中序遍历方式遍历\n");
printf("\t\t4、按照后序遍历方式遍历\n");
printf("\t\t5、计算结点的个数\n");
printf("\t\t6、计算叶子节点的个数\n");
printf("\t\t7、计算二叉树的深度\n");
printf("\t\t8、左右子树交换\n");
printf("\t\t9、退出程序\n");
PF;PF;
printf("\t请选择:");
int n,sum=0;
scanf("%d",&n);
switch(n)
{
case 1:system("cls");PF;PF;
printf("请按照先序的顺序输入不同的整数(-1代表为空):");
CreateBiTree(T);getchar();break;
case 2:system("cls");PF;
printf("前序输出的顺序为:");
PreOrderTraverse(T);break;
case 3:system("cls");PF;
printf("中序输出的顺序为:");
InOrderTraverse(T);break;
case 4:system("cls");PF;
printf("后序输出的顺序为:");
PosOrderTraverse(T);break;
case 5:system("cls");sum=NodeCount(T);
printf("结点的个数为:");
printf("%d\n",sum);break;
case 6:system("cls");sum=CountLeaves(T);
printf("叶子结点的个数为:");
printf("%d\n",sum);break;
case 7:system("cls");
printf("二叉树的深度为:");
max=Depth(T);
printf("%d\n",max);break;
case 8:system("cls");Exchange(T);
printf("交换成功!!\n\n");
break;
case 9:exit(0);
}
}
return 0;
}
//1 2 4 8 -1 -1 9 -1 -1 5 -1 10 -1 -1 3 6 -1 11 -1 -1 7 -1 -1
</span></span>