回 帖 发 新 帖 刷新版面

主题:各位大侠,可否帮小妹解决一下如何用C语言建立并打印二叉树

怎么用C语言做出这个算法啊?帮帮忙啊!

回复列表 (共17个回复)

沙发

#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");
}

板凳

上面程序某个孩子为空的 时候输入#号,如一个简单2叉树的树入为ab##c##!

3 楼

好!

4 楼

我有个简单点的算法:
#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 楼

遍历的同时 用图形画出来,我以前做过。

6 楼

上面人做的是不是太复杂拉, 我这里的输入输出是用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 楼

总觉得六楼的程序有点问题

8 楼

看不懂

9 楼

我觉的4,6楼写的程序很棒!在下佩服!!!!!!1

10 楼

7楼的
我这个程序没问题的,在vc++上通过了
没问题的  
至于看不懂  你可以去看看复旦大学出版的教材

我来回复

您尚未登录,请登录后再回复。点此登录或注册