二叉树 的建立及遍历 过程

我知道二叉树有先序遍历,中序遍历,后续遍历等等,不过这里说的的是输入一些点(11,LL) (7,LLL) (8,R) (5,) (4,L) (13,RL) (2,LLR) (1,RRR) (4,RR) ( );对这些点进行构建出对应的二叉数,并对其进行层次遍历。过程为:

1. 定义结构体变量(表示有关结点及特征)

2. 函数--申请结点

3. 函数---增加新结点

4. 对数据处理,进入输入过程(建树过程)

5. 对数的层次遍历,利用的是宽度优先搜索(队列可怜

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

# define maxn 100

typedef struct Tnode
{
    int have_value;                 //记录该结点是否被赋值 
    int v;                          //记录结点值 
    struct Tnode *left,*right;        //指指向左右结点的指针 
}Node;

Node* root;                       //二叉树的根结点
char s[maxn+10];                    //保存读入的结点,要足够大哦
int n=0,ans[maxn];                  //结点总数和输出序列
 
 
Node* newnode()                     //建立新的结点
{
   Node* u = (Node*)malloc(sizeof(Node)); //定义一Node指针,并指向申请的动态内存 
   if(u != NULL)            //若申请成功
   { 
       u->have_value = 0;                //新结点的初始化 
       u->left = u->right = NULL;        //指针的初始化操作,很重要 
   }
   return u;                    //返回指向该结点的指针 
}  

int failed;                       //记录输入是否正确 

void addnode(int v,char *s)         //对树的完善工作
{
 
   int i;
   int n = strlen(s);
   Node * u = root;                 //从根开始走
   for(i=0;i<n;i++)
   {
        if(s[i] == 'L')
        {
          if(u->left == NULL)            //结点不存在吗 
               u->left = newnode();        //不存在就建立新的结点 
          u = u->left;                    //向左延伸 
        }
        else if(s[i] == 'R')
        {
             if(u->right == NULL)
                  u->right = newnode();
             u = u->right; 
        } 
   }
   if(u->have_value)               //该结点是否被赋值过
      failed = 1;                   //输入有误
  else
  { u->v = v;                      //该结点的值赋给该结点 
   u->have_value = 1;             //宣布此结点已被赋值(标记作用)    
  } 
}





int read_input()                  //对各结点读入
{
    failed = 0;                    //刚开始显然读入无误
    root = newnode();
    for( ; ; )
    {
         if(scanf("%s",s)!=1)
           return 0;                 //系统故障导致输入结束
         if(!strcmp(s,"()"))break;            //读到结束标志,退出循环
         int v;
         scanf(&s[1],"%d",&v);          //读入结点值
         addnode(v,strchr(s,',')+1);       //查逗号,插结点,示具体情况而定 
    }
    return (1); 
}


    
     
int bfs()                       //宽度优先搜索,对二叉树遍历
{
    int front=0,rear=1;
    Node* q[maxn];
    q[0] = root;
    while(front <rear)
    {
        Node* u=q[front++];
        if(!u->have_value)
           return 0;               //存在结点,但未赋值,输入有误.....
        ans[n++] = u->v;
        if(u->left != NULL)q[rear++] = u->left;
        if(u->right != NULL)q[rear++] = u->right; 
    }
    return 1;
} 


int main()
{
    int i;
    read_input();
    bfs();
    for(i=0;i<n;i++)
    {
      if(i)printf(" ");
      printf("%d",ans[i]);
    }
    printf("\n");
    return 0;
    
}


 

 

posted on 2011-08-22 08:54  java课程设计例子  阅读(252)  评论(0编辑  收藏  举报