主题:各位大侠,可否帮小妹解决一下如何用C语言建立并打印二叉树
			 wqslw
				 [专家分:0]  发布于 2005-11-24 16:02:00
 wqslw
				 [专家分:0]  发布于 2005-11-24 16:02:00							
			怎么用C语言做出这个算法啊?帮帮忙啊!
						
					 
		
			
回复列表 (共17个回复)
		
								
				沙发
				
					 lvlu18 [专家分:150]  发布于 2005-11-25 09:12:00
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
lvlu18 [专家分:150]  发布于 2005-11-25 09:13:00				
				上面程序某个孩子为空的 时候输入#号,如一个简单2叉树的树入为ab##c##!
							 
						
						
				4 楼
				
					 hujun2007 [专家分:60]  发布于 2005-11-25 12:23:00
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
tiebanliji [专家分:0]  发布于 2005-11-25 13:33:00				
				遍历的同时 用图形画出来,我以前做过。
							 
						
				6 楼
				
					 huyejun [专家分:150]  发布于 2005-11-25 22:44:00
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
zhouzh1800 [专家分:0]  发布于 2005-11-27 11:09:00				
				总觉得六楼的程序有点问题
							 
						
				8 楼
				
					 zhouzh1800 [专家分:0]  发布于 2005-11-27 11:31:00
zhouzh1800 [专家分:0]  发布于 2005-11-27 11:31:00				
				看不懂
							 
						
				9 楼
				
					 六月的雨1 [专家分:0]  发布于 2005-11-27 12:02:00
六月的雨1 [专家分:0]  发布于 2005-11-27 12:02:00				
				我觉的4,6楼写的程序很棒!在下佩服!!!!!!1
							 
						
				10 楼
				
					 huyejun [专家分:150]  发布于 2005-11-27 16:44:00
huyejun [专家分:150]  发布于 2005-11-27 16:44:00				
				7楼的
我这个程序没问题的,在vc++上通过了
没问题的  
至于看不懂  你可以去看看复旦大学出版的教材
							 
									
			
我来回复