一个二叉树算法集--
来源:互联网 发布:java当前日期加三个月 编辑:程序博客网 时间:2024/05/16 13:38
#include<stdlib.h>
#include<stdio.h>
#define MAX 50
#define MAS 20
#define CHAR 1
#if CHAR
typedef char TElemType;
TElemType Nil=' ';
#define form "%c"
#else
typedef int TElemType;
TElemType Nil=0;
#define form "%d"
#endif
typedef struct node
{TElemType data;
struct node *left;
struct node *right;
struct node *parent;
}BiTNode,*BiTree;
BiTNode *InitBiTree(BiTNode *bt)
{
bt=NULL;
return bt;
}
BiTNode *CreateBiTree(BiTNode *bt)
{TElemType ch;
scanf(form,&ch);
if(ch==Nil) bt=NULL;
else
{bt=(BiTNode *)malloc(sizeof(BiTNode));
if(!bt) exit(0);
bt->data=ch; bt->parent=NULL;
bt->left=CreateBiTree(bt->left);
if(bt->left) bt->left->parent=bt;
bt->right=CreateBiTree(bt->right);
if(bt->right) bt->right->parent=bt;
}
return bt;
}
void PrintTree(BiTNode *bt,int i)
{ if(bt!=NULL)
{PrintTree(bt->right,i+5);
#if CHAR
if(bt->data!=Nil)
printf("%*c/n",i,bt->data);
#else
if(bt->data!=Nil)
printf("%*d/n",i,bt->data);
#endif
PrintTree(bt->left,i+5);
i=i-5;
}
}
void Prorder1(BiTNode *bt,void(*visit)(TElemType))/*先序遍历*/
{if(bt!=NULL)
{visit(bt->data);
Prorder1(bt->left,visit);
Prorder1(bt->right,visit);
}
}
void Prorder2(BiTNode *bt,void(*visit)(TElemType))/*中序遍历*/
{BiTNode *p,*stack[MAS];
int top;
top=0; p=bt;
while(top!=0||p!=NULL)
{while(p!=NULL)
{stack[top]=p; top++;
p=p->left;
}
if(top!=0)
{p=stack[top-1];
top--;
visit(p->data);
p=p->right;
}
}
}
void Prorder3(BiTNode *bt,void(*visit)(TElemType))/*后序遍历*/
{BiTNode *p,*stack[MAS];
int top;
top=0;
stack[top]=bt; top++;
while(top>0)
{p=stack[top-1]; top--;
while(p!=NULL)
{visit(p->data);
stack[top]=p->right;
top++;
p=p->left;
}
}
}
void visit(TElemType e)
{printf(form" ",e);
}
int SumLefts(BiTNode *bt,int sum)
{
if (bt!=NULL)
{
if (bt->left==NULL && bt->right==NULL)
{
printf("%4c",bt->data); sum++;
}
sum=SumLefts(bt->left,sum);
sum=SumLefts(bt->right,sum);
}
return(sum);
}
int SumTree(BiTNode *bt)
{static int sum=0;
if(bt!=NULL)
{printf("%4c",bt->data);
sum++;
sum=SumTree(bt->left);
sum=SumTree(bt->right);
}
return(sum);
}
BiTNode *Findchar(BiTNode *bt,char ch) /*二叉树查找结点*/
{BiTNode *p; /*利用函数名返回结果*/
if(bt!=NULL)
{if(bt->data==ch) p=bt;
p=Findchar(bt->left,ch);
p=Findchar(bt->right,ch);
}
if(p!=NULL) return(p);
else return(NULL);
}
main()
{ int j,i,a,sum=0;
BiTree bt;
bt=InitBiTree(bt);
#if CHAR
printf("请先序输入二叉树(如:ab三个空格表示a为根结点,b为左子树的二叉树)/n");
#else
printf("请先序输入二叉树(如:1 2 0 0 0表示1为根结点,2为左子树的二叉树)/n");
#endif
bt=CreateBiTree(bt);
printf("输入建立的二叉树!!!/n");
PrintTree(bt,5);
do{
printf("------------------------------------------------------------");
printf("/n 主菜单");
printf("/n 1 二叉树先序遍历");
printf("/n 2 二叉树中序遍历");
printf("/n 3 二叉树后序遍历");
printf("/n 4 二叉树叶子结点数");
printf("/n 5 二叉树结点数");
printf("/n 6 二叉树查找x结点");
printf("/n 0 退出");
printf("/n----------------------------------------------------------");
printf("/n");
printf("输入你要选择的数据:");
scanf("%d",&i);
switch(i)
{case 1: printf("先序遍历结果为:");
Prorder1(bt,visit);
break;
case 2: printf("后序遍历结果为:");
Prorder2(bt,visit);
break;
case 3: printf("中序遍历结果为:");
Prorder3(bt,visit);
break;
case 4: j=SumLefts(bt,sum);
printf("树的叶子结点数为%d:",j);
break;
case 5: j=SumTree(bt);
printf("树的结点数为%d:",j);
break;
case 6: printf("输入要查找的结点字符x:");
scanf("%c",&a); scanf("%*c");
j=Findchar(bt,a);
printf("要查找的结点的指针为%d:",j);
break;
case 0: exit(0);
}
printf("/n");
getch();
}while(i>0||i<8);
}
- 一个二叉树算法集--
- 一个数据结构二叉树算法
- 一个简单的二叉树排序算法
- 记一个算法切磋-二叉树
- 设计一个算法,判断一个二叉树是否为完全二叉树
- 算法11—判断一个树是不是二叉查询树
- 一个应用二叉树基本算法的程序
- 一个应用二叉树基本算法的程序 zz
- 判断一个二叉树是不是平衡的(算法)
- 设计一个算法,按照层次打印这棵二叉树。
- 每天一个算法之根据前序中序序列重建二叉树
- 每天一个算法之层序遍历二叉树
- 【算法题】如何判断一个二叉树是平衡二叉树
- [牛客]有一棵二叉树,请设计一个算法,按照层次打印这棵二叉树。
- 一个二叉树程序
- 构造一个二叉树
- 线索二叉树算法
- 数据结构-二叉树算法
- Everyday Is A Gift 每天都是一份珍贵的礼物
- ASPError(err)对象的相关基础知识
- 近10年好的计算机图书
- 争取外企高薪的五招技巧
- 分析“新秀”Silverlight如何挑战flash
- 一个二叉树算法集--
- 面试须知
- Joy and Pain 愉悦与痛苦
- pushad
- 透明PNG背景图片 For IE 6.0 Firefox Opera
- 常用的正则表达式
- ASPError对象与asp自定义505错误处理页面
- 认识预安装环境WINPE
- 构件化与SOA