#include <stdio.h>
#include <stdlib.h> //exit
#include<malloc.h>
//定义二叉链表结点结构
typedef struct node{
int data;
struct node *lchild, *rchild;
}BiTree;
//创建二叉链表
BiTree *CreateBiTree( )
{
BiTree *T;
int x;
scanf("%d",&x);
if(x==0) T=NULL;
else
{
if(!(T=(BiTree*)malloc(sizeof(BiTree))))
exit(-1);
T->data = x;
T->lchild =CreateBiTree();
T->rchild =CreateBiTree();
}
return T;
}
//先序遍历二叉树
void Preorder(BiTree *T )
{
if(T)
{
printf("%d",T->data);
Preorder( T->lchild );
Preorder( T->rchild );
}
}
//中序遍历二叉树
void Inorder(BiTree *T )
{
if(T)
{
Inorder( T->lchild );
printf("%d",T->data);
Inorder( T->rchild );
}
}
//后序遍历二叉树
void Postorder(BiTree *T )
{
if(T)
{
Postorder( T->lchild );
Postorder( T->rchild );
printf("%d",T->data);
}
}
//计算二叉树的深度
int Depth(BiTree *T)
{ int depl,depr;
if(T)
{
depl=Depth(T->lchild);
depr=Depth(T->rchild);
if (depl>=depr) return (depl+1);
else return (depr+1);
}
else return 0;
}
//求二叉树结点的个数
int Total(BiTree *T)
{
int left,right;
if (T==NULL) return 0;
left= Total(T->lchild);
right= Total(T->rchild);
return 1+left+right;
}
//求结点的双亲结点
int Parent(BiTree *T,int x)
{ //若返回值为0,则结点不在树中
//若返回值为1,则找到双亲结点
if(T)
{
if(T->data ==x)
{
printf("该结点为树跟,不存在双亲");
return 0;
}
else if(T->lchild&&T->lchild->data==x||T->rchild&&T->rchild->data==x)
{
printf("该结点为的双亲%d",T->data);
return 1;
}
else
{
if(Parent(T->lchild, x))
return 1;
else
return Parent(T->rchild, x);
}
}
else return 0;
}
//判定结点所在的层次
int Level(BiTree *T,int x,int n)
{//若返回值为0,则结点不在树中,否则返回结点的层次
int lev;
if(T)
{
if(T->data==x) return n;
lev=Level(T->lchild,x,n+1);
if(lev)
return lev;
else
return Level(T->rchild,x,n+1);
}
else return 0;
}
void freeTree(BiTree *T)
{
BiTree *ltree,*rtree;
if(T)
{
ltree=T->lchild;
rtree=T->rchild;
free(T);
freeTree(ltree);
freeTree(rtree);
}
}
void main()
{
int sel;
BiTree *T;
int x;
do{
printf("┌─────────────────┐\n");
printf("︳ 二叉树的基本操作(二叉链表实现) ︳\n");
printf("︳ ︳\n");
printf("︳ 1 创建 2、先序遍历 ︳\n");
printf("︳ 3、中序遍历 4、后序遍历 ︳\n");
printf("︳ 5、深度 6、结点个数 ︳\n");
printf("︳ 7、求双亲 8、结点层次 ︳\n");
printf("︳ 9、退出 ︳\n");
printf("└─────────────────┘\n");
printf("请选择:");
scanf("%d",&sel);
switch(sel)
{
case 1:
printf("\n请输入二叉树中的结点:\n");
T=CreateBiTree();
break;
case 2:
printf("\n先序遍历序列:\n");
Preorder(T );
break;
case 3:
printf("\n中序遍历序列:\n");
Inorder(T );
break;
case 4:
printf("\n后序遍历序列:\n");
Postorder(T );
break;
case 5:
printf("\n二叉树的深度为:%d\n",Depth(T));
break;
case 6:
printf("\n二叉树中结点总数为:%d\n",Total(T));
break;
case 7:
printf("\n请输入一个结点:\n");
scanf("%d",&x);
if(!Parent(T,x)) printf("\n未找到双亲");
break;
case 8:
printf("\n请输入一个结点:\n");
scanf("%d",&x);
printf("\n该结点层次为:%d\n",Level(T,x,1));
break;
case 9:
freeTree(T);
return;
}
printf("\n按任意键继续....\n");
getch();
system("cls");
}while(1);
//释放链表
}
//测试数据:
//1 2 3 0 0 4 5 0 6 0 0 7 0 0 0
标签:结点,return,int,BiTree,代码,二叉树,printf,基本操作,rchild
From: https://www.cnblogs.com/little-monster-lhq/p/16951677.html