您的位置:首页 > 其它

文章标题

2016-08-07 10:46 344 查看
重点内容 二叉树的建立与遍历

强调内容 递归算法和指针引用

//递归函数的调用
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#define ERROR 1
typedef struct BiTNode{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
typedef int Status;
Status CreateBiTree(BiTree &T)
{//构造二叉树,按先序次序输入二叉树中结点的值,空格字符表示空树
char ch;
scanf("%c", &ch);
if (ch == ' ') T = NULL;
else
{
if (!(T = (BiTNode *)malloc(sizeof(BiTNode))))  exit(OVERFLOW);
T->data = ch;               //生成根结点
CreateBiTree(T->lchild);    //构造左子树
CreateBiTree(T->rchild);    //构造右子树
}
return 0;
}//CreateBiTree

Status PreOrderTraverse(BiTree T)
{//先序遍历二叉树T,对于每个结点调用visit函数一次
if (T)
{
printf("%c",T->data); //visit函数最简单形式

if (PreOrderTraverse(T->lchild))
if (PreOrderTraverse(T->rchild))  return 0;
return ERROR;
}
else return 0;
}//PreOrderTraverse
Status InOrderTraverse(BiTree T)
{//中序遍历二叉树T,对于每个结点调用visit函数一次
if (T)
{
if (T->lchild) InOrderTraverse(T->lchild);
printf("%c", T->data);
if (T->rchild) InOrderTraverse(T->rchild);
}
return 0;
}//InOrderTraverse
Status PostOrderTraverse(BiTree T)
{//后序遍历二叉树T,对于每个结点调用visit函数一次
if (T)
{
if (T->lchild) PostOrderTraverse(T->lchild);
if (T->rchild) PostOrderTraverse(T->rchild);
printf("%c", T->data);
}
return 0;
}//PostOrderTraverse
Status DeepBiTree(BiTree T)
{//求二叉树高度
int l = 0, r = 0;
if (T == NULL) return 0;
else
if (T->lchild == NULL && T->rchild == NULL) return 1;
else{
l = DeepBiTree(T->lchild) + 1;
r = DeepBiTree(T->rchild) + 1;
return (l>r ? l : r);
}
}//HighBiTree
Status LeafBiTree(BiTree T)
{//求二叉树的叶子结点
if (T == NULL) return 0;
else
if (T->lchild == NULL && T->rchild == NULL) return 1;
else return (LeafBiTree(T->lchild) + LeafBiTree(T->rchild));
}//LeafBiTree
Status Parent(BiTree T, char son){
//查找指定结点的双亲,从根节点开始
if (T == NULL) return 0;
if (((T->lchild) && (T->lchild->data == son)) ||((T->rchild) && (T->rchild->data == son))){
printf("该结点的双亲为:%c\n",T->data);
return 0;
}
else{
Parent(T->lchild, son);
Parent(T->rchild, son);
return 0;
}
}
Status Borther(BiTree T, char borther){
//查找指定节点的兄弟,从根节点开始
if (T == NULL) return 0;
if ((T->lchild) && (T->lchild->data == borther)){
if (T->rchild){
printf("该节点的兄弟为:%c\n",T->rchild->data);
}
else{
printf("该节点没有兄弟节点");
}
return 0;
}
else if((T->rchild) && (T->rchild->data == borther)){
if (T->lchild){
printf("该节点的兄弟为:%c",T->lchild->data);
}
else{
printf("该节点没有兄弟节点");
}
return 0;
}
else{
Borther(T->lchild, borther);
Borther(T->rchild, borther);
return 0;
}
}

void main(){
int n;
BiTNode *T;

do{
printf("\n");
printf("**********二叉树的基本操作及应用*****************\n");
printf("*1  创建                                  *\n");
printf("*2  遍历                                  *\n");
printf("*3  计算树的深度及叶子结点的个数          *\n");
printf("*4  查找双亲                                *\n");
printf("*5  查找兄弟                                *\n");
printf("*6  退出                                  *\n");
printf("*************************************\n");
printf("请选择:");
scanf("%d", &n);
switch(n){
case 1:
getchar();
printf("请先序输入二叉树的结点,空格表示空树\n");

CreateBiTree(T);
printf("创建成功");

break;
case 2:
printf("先序遍历:");
PreOrderTraverse(T);
printf("\n");
printf("中序遍历:");
InOrderTraverse(T);
printf("\n");
printf("后序遍历:");
PostOrderTraverse(T);
printf("\n");
break;
case 3:
printf("树的深度为:%d\n",DeepBiTree(T));

printf("叶子结点的个数为:%d",LeafBiTree(T));

getchar(); getchar();
break;
case 4:
char son;
printf("请输入需要查询的节点:");
getchar();
scanf("%c",&son);
Parent(T, son);
break;
case 5:
char borther;
printf("请输入需要查询的节点:");
getchar();
scanf("%c",&borther);
Borther(T, borther);
break;
case 6: break;
default:
printf("ERROR!"); break;
}
}while(n!=6);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: