主题:各位大侠,可否帮小妹解决一下如何用C语言建立并打印二叉树
wqslw
[专家分:0] 发布于 2005-11-24 16:02:00
怎么用C语言做出这个算法啊?帮帮忙啊!
回复列表 (共17个回复)
沙发
lvlu18 [专家分:150] 发布于 2005-11-25 09:12:00
#include "stdafx.h"
#include "stdlib.h"
#include "stdio.h"
typedef struct BiTNode
{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
struct chtp
{
int len;
char ch[100];
};
struct chtp s;
int i=0;
int CreateBiTree(BiTree &T)
{
char c;
c=s.ch[i];i++;
if(c=='#') T=NULL;
else
{
if(!(T=(BiTNode *) malloc (sizeof(BiTNode)))) exit(-1);
T->data=c;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
return 1;
}//先序递归建立二叉树
Visit(char &e)
{
printf("%c",e);
return 1;
}//遍历访问结点
int PreOrderTraverse(BiTree &T,int(* Visit)(char &e))
{
if(T)
{
if(Visit(T->data))
if(PreOrderTraverse(T->lchild,Visit))
if(PreOrderTraverse(T->rchild,Visit)) return 1;
return 0;
}else return 1;
}//先序递归遍历
int main()
{
BiTree T;
int j;
char exp[100];
printf("请输入二叉树,并以!号结束\n");
gets(exp);
for(j=0,s.len=0;exp[j]!='!';j++,s.len++) s.ch[j]=exp[j];
CreateBiTree(T);
printf("二叉树已经建立!\n");
printf("递归先序遍历为:");
PreOrderTraverse(T,Visit);
printf("\n");
}
板凳
lvlu18 [专家分:150] 发布于 2005-11-25 09:13:00
上面程序某个孩子为空的 时候输入#号,如一个简单2叉树的树入为ab##c##!
4 楼
hujun2007 [专家分:60] 发布于 2005-11-25 12:23:00
我有个简单点的算法:
#define NULL 0
typedef struct bitnode
{
char data;
struct bitnode *lchild,*rchild;
}bintnode,*bintree;
bintree createbitree()
{
bintree t;
char ch;
scanf("%c",&ch);
if(ch==' ') t=NULL;
else
{
t=(bintnode *)malloc(sizeof(bintnode));
t->data=ch;
t->lchild=createbitree();
t->rchild=createbitree();
}
return(t);
}
void preorder(bintree t)/*前序遍历*/
{
if(t)
{
printf("%c",t->data);
preorder(t->lchild);
preorder(t->rchild);
}
}
void midorder(bintree t)/*中序遍历*/
{
if(t)
{
midorder(t->lchild);
printf("%c",t->data);
midorder(t->rchild);
}
}
void lastorder(bintree t)/*后序遍历*/
{
if(t)
{lastorder(t->lchild);
lastorder(t->rchild);
printf("%c",t->data);
}
}
main()
{
bintree a;
clrscr();
a=createbitree();
preorder(a);
printf("\n");
midorder(a);
printf("\n");
lastorder(a);
printf("\n");
}
注意建树时比如:
a
/ \
b e
/ \ / \
c d () ()
/ \ / \
() () () ()
在输入时得输abc()()d()()e()()括号是空格.则前序:abcde,中序:cbdae,后序:cdbea.试试吧
5 楼
tiebanliji [专家分:0] 发布于 2005-11-25 13:33:00
遍历的同时 用图形画出来,我以前做过。
6 楼
huyejun [专家分:150] 发布于 2005-11-25 22:44:00
上面人做的是不是太复杂拉, 我这里的输入输出是用c++的方法,稍稍改变就可以啦
用层号方法生成树
#include<iostream>
using namespace std;
#define MAXM 10
#define MAXN 100
#include<malloc.h>
typedef struct node{
int lev;
char data;
struct node *child[MAXM];
struct node *parent;
}NODE;
typedef struct dnode{
int lev;
char data;
}DNODE;
DNODE a[MAXN];
int m,n;
NODE*lev_tree(DNODE a[],int m,int n)
{
int i,j;
NODE *root,*p,*q;
if(n<1)return (NULL);
root=(NODE*)malloc(sizeof(NODE));
root->lev=a[0].lev;
root->data=a[0].data;
for(i=0;i<m;i++)
root->child[i]=NULL;
root->parent=NULL;
p=root;
for(i=1;i<n;i++)
{
q=(NODE*)malloc(sizeof(NODE));
q->lev=a[i].lev;
q->data=a[i].data;
for(j=0;j<m;j++)
q->child[j]=NULL;
while(q->lev<=p->lev)
p=p->parent;
q->parent=p;
j=-1;
while(p->child[++j]!=NULL);
p->child[j]=q;
p=q;
}
return (root);
}
void pre_order(NODE *t,int n)
{
int i;
if(t!=NULL)
{
cout<<t->data<<endl;
for(i=0;i<n;i++)
pre_order(t->child[i],m);
}
}
void m_order(NODE *t,int m)
{
int i;
if(t!=NULL)
{
for(i=0;i<m;i++)
m_order(t->child[i],m);
cout<<t->data<<endl;
}
}
int main()
{
int i,j;
char k;
n=0;
for(i=0;i<MAXN;i++)
{
cout<<"please enter "<<endl;
cin>>j>>k;
if(j==-1&&k=='q') break;
a[i].data=k;
a[i].lev=j;
n++;
}
m=3;
NODE*head=lev_tree(a,m,n);
cout<<"前序遍历 ";
pre_order(head,m);
cout<<"后序遍历;";
m_order(head,m);
return 0;
}
7 楼
zhouzh1800 [专家分:0] 发布于 2005-11-27 11:09:00
总觉得六楼的程序有点问题
8 楼
zhouzh1800 [专家分:0] 发布于 2005-11-27 11:31:00
看不懂
9 楼
六月的雨1 [专家分:0] 发布于 2005-11-27 12:02:00
我觉的4,6楼写的程序很棒!在下佩服!!!!!!1
10 楼
huyejun [专家分:150] 发布于 2005-11-27 16:44:00
7楼的
我这个程序没问题的,在vc++上通过了
没问题的
至于看不懂 你可以去看看复旦大学出版的教材
我来回复