急!写了一个关于二叉排序树的一些算法,可是不能运行,请大家帮忙改改
请大家帮帮忙看看这个程序 ,谢谢……#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define MAX 50
typedef struct BNode{
char data;
struct BNode *lchild;
struct BNode *rchild;
}BNode,*BiTree;
//插入新结点
int InsertNode(BiTree *T,char e){
BNode *f,*p;
p=*T;
while(p){
f=p;
if(p->data==e) return 0;
else if(e<p->data) p=p->lchild;
else p=p->rchild;
}
p=(BiTree)malloc(sizeof(BNode));
p->data=e;
p->lchild=NULL;
p->rchild=NULL;
if(*T==NULL) *T=p;
else if(e<f->data) f->lchild=p;
else f->rchild=p;
return 1;
}
//二叉排序树的创建
BiTree Creat(BiTree T){
//BiTree T=NULL;
T=NULL;
char e;
scanf("%c",&e);
while(e!='#'){
InsertNode(&T,e);
scanf("%c",&e);
}
return T;
}
//前序遍历二叉树
int ProTree(BiTree T){
BiTree p=T;
if(p==NULL) return 0;
printf("%c",p->data);
ProTree(p->lchild);
ProTree(p->rchild);
return 1;
}
//中序遍历二叉树
int MidTree(BiTree T){
BiTree p=T;
if(p==NULL) return 0;
MidTree(p->lchild);
printf("%c",p->data);
MidTree(p->rchild);
return 1;
}
//后序遍历二叉树
int BacTree(BiTree T){
BiTree p=T;
if(p==NULL) return 0;
BacTree(p->lchild);
BacTree(p->lchild);
printf("%c",p->data);
return 1;
}
//中序遍历的非递归算法
void UmidTree(BiTree T){
BNode *a[MAX],*p;
int top=0;
p=T;
a[top]=p;
top++;
while(top){
while(p){
a[top]=p->lchild;
top++;
p=p->lchild;
}
top--;
p=a[top];
if(top!=0){
printf("%c",p->data);
top--;
a[top]=p->rchild;
p=p->rchild;
}
}
}
//层次遍历二叉树
void arrTree(BiTree T){
BNode *a[MAX],*p;
int top=0,base=0,i=0;
p=T;
a[base]=p;
a[top]=p;
top++;
i++; //判断栈是否有空
while(i){
printf("%c",p->data);
i--;
if(p->lchild!=NULL){
a[top++]=p->lchild;
i++;
}
if(p->rchild!=NULL){
a[top++]=p->rchild;
i++;
}
p=a[base++];
}
}
//查找给定关健字
int search(BiTree T,char k){
BNode *p=T;
int i=0,j=0,t=1;
while(t&&p){
if(k==p->data) t=0;
else if(k<p->data){
p=p->lchild;
search(p,k);
i++;j=j*2;
}
else{
p=p->rchild;
search(p,k);
i++;j=j*2+1;
}
}
if(p==NULL){
printf("do not find the word!:");
return 0;
}
else{
printf("%c,%c",i,j);
return 1;
}
}
//二叉树深度算法
int Depth(BiTree T){
BNode *p=T;
int ldepth,rdepth;
while(T!=NULL){
if(p->lchild!=NULL){
p=p->lchild;
ldepth=Depth(p);
}
if(p->rchild!=NULL){
p=p->rchild;
rdepth=Depth(p);
}
if(ldepth>=rdepth)
return ldepth;
else return rdepth;
}
//if(T==NULL)
return 1;
}
//计算二叉树叶子数
int Nleave(BiTree T){
BNode *p=T;
int i=0;
while(p){
if(p->lchild!=NULL){
p=p->lchild;
Nleave(p);
}
if(p->rchild!=NULL){
p=p->rchild;
Nleave(p);
}
if(p->lchild==NULL&&p->rchild==NULL) i++;
}
return i;
}
//交换各结点的左右子树
void xchangNode(BiTree T){
BNode *p=T;
BNode *q;
while(p){
if(p->lchild!=NULL){
p=p->lchild;
xchangNode(p);
}
if(p->rchild!=NULL){
p=p->rchild;
xchangNode(p);
}
q=p->rchild;
p->rchild=p->lchild;
p->lchild=q;
}
}
void main(){
BiTree T;
Creat(T);
ProTree(T);
//printf("\n");
//MidTree(T);
//printf("\n");
//BacTree(T);
//printf("\n");
//UmidTree(T);
//printf("\n");
printf("%d",Depth(T));
}
----------------解决方案--------------------------------------------------------
去数据结构区问吧 那高手应该多点
----------------解决方案--------------------------------------------------------
我上机的运行的2叉树 可以运行
//功能:中序遍历非递归算法//时间:2006.11.3
//作者:lwh
//二叉树四种遍历方法:前序、中序、后序、层次
#include<fstream>
using namespace std;
typedef char TElemType;
ifstream in("input.txt");
ofstream out("output.txt");
//二叉树的二叉链表存储表示
typedef struct BiTNode
{
TElemType data;
BiTNode *lchild,*rchild; // 左右孩子指针
}BiTNode,*BiTree;
//功能:由先序次序序列创建二叉树
//参数:引用指针
//说明:可应付空树 参见bitree.cpp中的同名函数
//结论:建立链式二叉树最好的方法
void CreateBiTree(BiTree &t)//按先序次序输入二叉树中结点的值,"#"表示空子树,"@"表示输入结束标志!
{ //t为指针引用传递
char ch;
ch=in.get(); //读取先序次序二叉树中的结点值
if(ch=='@')return;//结尾
if(ch=='#') t=NULL;//空子树
else{
t=new BiTNode;
t->data=ch;t->lchild=NULL;t->rchild=NULL;
CreateBiTree(t->lchild);
CreateBiTree(t->rchild);
}
}//CreateBiTree
void PreOrderTraverse(BiTree t)
{
if(t) {
out<<t->data;
PreOrderTraverse(t->lchild);
PreOrderTraverse(t->rchild);
}
}
void InOrderTraverse(BiTree t)
{
if(t) {
InOrderTraverse(t->lchild);
out<<t->data;
InOrderTraverse(t->rchild);
}
}
void PostOrderTraverse(BiTree t)
{
if(t) {
PostOrderTraverse(t->lchild);
PostOrderTraverse(t->rchild);
out<<t->data;
}
}
void LevelTraverse(BiTree t)
{
BiTNode Qu[100];
int front=-1,rear=-1;
if(t) Qu[++rear]=*t;
while(front!=rear)
{
out<<Qu[++front].data;
if(Qu[front].lchild)
Qu[++rear]=*Qu[front].lchild;
if(Qu[front].rchild)
Qu[++rear]=*Qu[front].rchild;
}
}
void InorderStackTraverse(BiTree t)//中序非递归算法
{
BiTree p,stack[100];//假设的最大栈空间数
int top=-1;
p=t;
while((p!=NULL)||top!=-1)
{
while(p!=NULL)
{ top++;stack[top]=p;p=p->lchild;}
if(top!=-1)
{ p=stack[top];top--;out<<p->data<<' ';p=p->rchild;}
}
}
void main()
{
BiTree tt=NULL;
CreateBiTree(tt);
PreOrderTraverse(tt);
out<<endl;
InOrderTraverse(tt);
out<<endl;
PostOrderTraverse(tt);
out<<endl;
LevelTraverse(tt);
out<<endl;
InorderStackTraverse(tt);
out<<endl;
in.close();
out.close();
}
----------------解决方案--------------------------------------------------------
谢谢大家。。。
----------------解决方案--------------------------------------------------------
有的时候编译器是有影响的
----------------解决方案--------------------------------------------------------