完整正确的C语言二叉树程序

程序功能:用户按先序遍历输入一颗二叉树,叶子节点用空格输入,程序存储该二叉树,并在DOS窗口下输出该二叉树图形。
C++也行~~

我有现成的,分享给大家了。

#include<stdio.h>
#include<stdlib.h>
#define maxsize 100
typedef struct btnode
{
int data ; //结点数据类型
struct btnode *lchild, *rchild; //定义左、右孩子为指针型
} bitree;
bitree *creat(bitree *t) //创建二叉树
{
bitree *s,*p,*q;
int x;
scanf("%d",&x);
while(x!=0)
{
s= ( bitree *)malloc(sizeof(bitree));
s->data=x;
s->lchild=s->rchild=NULL;
if(t==NULL)
t=s;
else
{
p=t;
while(p)
{
q=p;
if(s->data<p->data)
p=p->lchild;
else
p=p->rchild;
}
if(s->data<q->data)
q->lchild=s;
else
q->rchild=s;
}
scanf("%d",&x);
}
return(t);
}
bitree *insert(bitree *t) //插入结点
{
bitree *s,*p,*q;
int x;
scanf("%d",&x);
while(x!=0)
{
s= ( bitree *)malloc(sizeof(bitree));
s->data=x;
s->lchild=s->rchild=NULL;
if(t==NULL)
t=s;
else
{
p=t;
while(p)
{
q=p;
if(s->data<p->data)
p=p->lchild;
else
p=p->rchild;
}
if(s->data<q->data)
q->lchild=s;
else
q->rchild=s;
}
scanf("%d",&x);
}
return(t);
}
void search(bitree *t,int k) //查找数据
{
int flag=0;
while(t!=NULL)
{
if(t->data==k)
{
printf("已查到要找的数!\n");
flag=1;
break;
}
else
if(t->data<k)
t=t->rchild;
else
t=t->lchild;
}
if(flag!=1)
printf("没有找到要查找的数据!\n");
}
bitree *dele(bitree *t,int k) //删除数据
{
int flag;
bitree *p,*q,*s=NULL,*f;
f=t;
while(t!=NULL) //查找数据
{
if(t->data==k)
{
printf("已找到所查找的数!\n");
break;
}
else
if(t->data<k)
{
p=t;
t=t->rchild;
flag=0;
}
else
{
p=t;
t=t->lchild;
flag=1;
}
}
if(t->lchild==NULL&&t->rchild==NULL) //删除叶子结点
{
free(t);
if(flag==0)
p->rchild=NULL;
else
p->lchild=NULL;
}
else
{
if(t->lchild==NULL&&t->rchild!=NULL) //删除只有右子树的结点
{
if(flag==0)
p->rchild=t->rchild;
else
p->lchild=t->rchild;
free(t);
}
else
{
if(t->lchild!=NULL&&t->rchild==NULL) //删除只有左子树的结点
{
if(flag==0)
p->rchild=t->lchild;
else
p->lchild=t->lchild;
free(t);
}
else //删除左右子树都有的结点
{
p=t;
t=t->lchild;
q=t;
while(t->rchild)
{
q=t;
t=t->rchild;
}
if(t==q)
{
p->data=t->data;
p->lchild=t->lchild;
free(t);
}
else
{
p->data=t->data;
q->rchild=t->lchild;
free(t);
}
}
}
}
return(f);
}
void output(bitree * t) //实现二叉树的遍历
{
bitree *q[maxsize],*p;
int f,r;
q[0]=t;
f=r=0;
while (f<=r)
{
p=q[f];
f++;
printf("%d ",p->data);
if(p ->lchild!=NULL)
{
r++;
q[r]=p->lchild;
}
if (p->rchild!=NULL)
{
r++;
q[r]=p->rchild;
}
}
}
void main()
{

bitree *q=NULL,*r;
int m,n,x=1;
while(x==1)
{
system("cls");
printf(" ********************************\n");
printf(" 创建请按1\n");
printf(" 插入请按2\n");
printf(" 查找请按3\n");
printf(" 删除请按4\n");
printf(" 显示请按5\n");
printf(" 退出请按0\n");
printf(" ********************************\n");
scanf("%d",&m);
switch(m)
{
case 1:printf("请输入数据并以'0'结束\n");
r=creat(q);system("pause");break;
case 2:printf("请输入数据并以'0'结束\n");
r=insert(r);break;
case 3:printf("请输入要查找的数:");
scanf("%d",&n);
search(r,n);
system("pause");
break;
case 4:printf("请输入要删除的数:");
scanf("%d",&n);
r=dele(r,n);
printf("已删除输入数据!\n");
system("pause");
break;
case 5:output(r);system("pause");printf("\n");
break;
case 0:x=0;break;
}

}
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-05-16
#include<iostream>
using namespace std;
class Node
{
private:
char data;
Node* left;
Node* right;
public:
Node(int index,Node* lptr=NULL,Node* rptr=NULL)
{
data=index;
left=lptr;
right=rptr;
}
~Node(){}
Node* Getleft(){return left;}
void Setleft(Node* l){left=l;}
Node* Getright(){return right;}
void Setright(Node* r){right=r;}
char& Getdata(){return data;}
void Setdata(const int& index){data=index;}
friend class BinTree;
};
class BinTree
{
private:
Node* root;
char stop;
public:
BinTree(Node* t=NULL){root=t;}
virtual ~BinTree(){Del(root);};

Node* Father(Node* t,Node* p);//在以t为根的子树中寻找p的父结点

Node* Find(Node* t,const char& item)const;//在以t为根的子树中寻找data域为item的结点

void DelSubTree(Node* t);//从树中删除节点t及其左右子树
void Del(Node* t);//删除节点t及其左右子树

void Preorder(Node* t)const;//先根
void InOrder(Node* t)const;//中根
void PostOrder(Node* t)const;//后根
void LeverOrder(Node* t,Node**& b,int& length);//层次遍历

void CreatBinTree(int tostop);//创建二叉树
Node* Creat();

Node* GetRoot(){return root;}
void SetRoot(Node* t){root=t;}
int GetStop(){return stop;}
void SetStop(char tostop){stop=tostop;}
int IsEmpty(){return root==NULL?1:0;}

bool Comptree(Node* t);

};

//先根创建二叉树
void BinTree::CreatBinTree(int tostop)
{
SetStop(tostop);cout<<"根节点是:";
root=Creat();cout<<endl;

}
Node* BinTree::Creat()
{
Node* t,*t1,*t2;
char item;cin>>item;
if(item==stop){t=NULL;return t;}
else
{
if(!(t=new Node(item,NULL,NULL))) return NULL;
cout<<item<<"左儿子是:";t1=Creat();
t->Setleft(t1);
cout<<item<<"右儿子是:";t2=Creat();
t->Setright(t2);
return t;
}
}

//先根遍历输出二叉树
void BinTree::Preorder(Node* t)const
{
//if(t==NULL) return;
if(t!=NULL)
{
cout<<t->Getdata()<<" ";
Preorder(t->Getleft());
Preorder(t->Getright());
}

}

int main()
{

LinkedList l1;
cout<<"1.InsertFront(item)"<<endl;
cout<<"2.InsertRear(item)"<<endl;
cout<<"3.InsertAt(item)"<<endl;
cout<<"4.DeleteFont()"<<endl;
cout<<"5.DeleteRear()"<<endl;
cout<<"6.DeleteAt()"<<endl;
cout<<"7.Search(int& item)"<<endl;
cout<<"8.Find(int k,int &item)"<<endl;
cout<<"9.FindCur(item)"<<endl;
cout<<"10.Print()"<<endl;

cout<<"请选择操作:";

int c=0;
while(cin>>c){
switch(c)
{
case 1:{
cout<<"请输入要插入的数:";
int a;
cin>>a;
l1.InsertFront(a);
}
break;

case 2:{
cout<<"请输入要插入的数:";
int a;
cin>>a;
l1.InsertRear(a);
}
break;

case 3:{
cout<<"请输入要插入的数:";
int a;
cin>>a;
l1.InsertAt(a);
}
break;

case 4:
{
l1.DeleteFront();
}
break;
case 5:
{
l1.DeleteRear();
}
break;

case 6:
{
l1.DeleteAt();
}
break;

case 7:{
cout<<"请输入要查找的数:";
int a;
cin>>a;
int b=l1.Search(a);
cout<<"要查找的数的位置是:"<<b<<endl;
}
break;

case 8:{
cout<<"请输入要查找位置:";
int a;
cin>>a;
int b;l1.Find(a,b);
cout<<"要查找的数是:"<<b<<endl;
}
break;

case 9:{

int b;l1.FindCur(b);
cout<<"要查找的数的位置是:"<<b<<endl;
}
break;

case 10:
l1.Print();
break;

}

cout<<"请选择操作:";

}

return 0;
}

看着不需要的地方删掉就行 创建二叉树有标注,我的是以'#'结尾的 改下就可以了
第2个回答  2010-05-16
/************************************************************************/
/* coder:huifeng00
/* 时间:2010-5-16 下午5点
/* 功能:实现空格为虚节点的二叉树的建立,并且格式化打印二叉树
/************************************************************************/

#include <stdio.h>
#include <stdlib.h>

typedef struct node
{
char data;
struct node *left,*right;
}Node,*PNode;
PNode createBtree(PNode root)//创建二叉树,控制台下输入,基于先序遍历输入
{
char data;
scanf("%c",&data);
if (data==' ')
{
root=NULL;
return root;
}
root = (PNode)malloc(sizeof(Node));
root->data = data;
root->left = createBtree(root->left);
root->right = createBtree(root->right);

return root;
}

void printFormat(PNode root)//格式化打印二叉树
{
static i = 0;//这是控制格式化。
int j;
if (root==NULL)
{
return;
}
for (j=0;j<i;j++)
{
printf(" ");
}
printf("%c\n",root->data);
i++;
printFormat(root->left);
printFormat(root->right);
i--;
}
int main()
{
PNode root=NULL;
root = createBtree(root);
printFormat(root);
return 0;
}
程序如上。
虚节点用空格输入的。例如你输入
先序遍历
234空格空格5空格6空格空格7空格空格回车就可以看到结果。
另外你说的输出二叉树图形。
我是这样输出的。第1列是最高节点,就是根。
第2列是第2层节点。
格式话是通过缩进完成的。
这个图形可以参考下面的地址。
http://hi.baidu.com/huifeng00/blog/item/c1e37a4d59310b3caec3ab32.html
我空间曾经写过大量的关于二叉树和多叉树的程序,可以参考下,在数据结构类别下。
这个程序是可以运行的,运行工具是vc6.0.
语言是C.
如还有疑问,可以空间留言,或hi我。
第3个回答  2010-05-15
可惜啊,我没好好学,不懂啊
第4个回答  2010-05-15
呵呵 这个工程很浩大,我们有个作业和这个差不多,编了好久呢,不过是用C++编的本回答被提问者采纳