Chinaunix首页 | 论坛 | 博客
  • 博客访问: 61812
  • 博文数量: 33
  • 博客积分: 1510
  • 博客等级: 上尉
  • 技术积分: 312
  • 用 户 组: 普通用户
  • 注册时间: 2009-02-08 18:20
文章分类

全部博文(33)

文章存档

2011年(1)

2010年(2)

2009年(30)

我的朋友

分类: C/C++

2010-10-19 08:18:57

二叉树的创建:

#include "stdio.h"
typedef char ElemType;
#define MAXNUM 150

/* 二叉树结点定义 */
typedef struct BTNode
{
    ElemType data;         /* data field */
    struct BTNode *lchild;
    struct BTNode *rchild;    
} BTNode;

/* 辅助的二叉树索引数组 */
BTNode *p[MAXNUM+1];

/* 根据用户输入创建二叉树 */
/* 二叉树结点信息:数据域,以及在完全二叉树中的索引值 */
BTNode *Create_BiTree(void)
{
        BTNode* t = NULL;
        int i;
        int j;
        char ch;
    
        printf("\n enter i, ch :");
        scanf("%d,%c", &i, &ch);
        
        while (i != 0 && ch != '#' )
        {
            BTNode* s = (BTNode*)malloc(sizeof(BTNode));
            s->data = ch;
            s->lchild = s->rchild = NULL;
            
            p[i] = s;
            
            if ( i == 1 )
                t = s;
            else
            {
                j = i/2;
                
                if ( i%2 == 0 )
                    p[j]->lchild = s;
                else
                    p[j]->rchild = s;
            }
            printf("\n enter i, ch :");
            scanf("%d,%c", &i, &ch);
        }
        
        return t;
}

int main(void)
{
    BTNode* t;
    t = Create_BiTree();
/*    
    preorder(t);
    printf(" preorder\n");
    preorder_recursive(t);
    printf(" preorder_recursive\n");

    Inorder(t);
    printf(" Inorder\n");
    Inorder_recursive1(t);
    printf(" Inorder_recursive1\n");
    Inorder_recursive2(t);
    printf(" Inorder_recursive2\n");


    Postorder(t);
    printf(" Postorder\n");
    Postorder_recursive(t);
    printf(" Postorder_recursive\n");

    LevelOrder(t);
    printf(" LevelOrder\n");
*/
    
    getchar();
    getchar();

    return 0;
}

 

二叉树的 前序遍历,递归、非递归的实现:

 

/* 前序遍历的递归实现 */
void preorder(BTNode *bt)
{
     if (bt)
   {
           printf("%c ",bt->data);
      preorder(bt->lchild);
      preorder(bt->rchild);
    }
}

/* 前序遍历的非递归实现 */

void preorder_recursive(BTNode *bt)
{
    BTNode* p;
    BTNode* s[MAXNUM+1]; /* 辅助的模拟栈 */
    int top;
    
    p=bt;
    top=-1;
  while(p||top != -1)
  {
         if(p)
       {
           printf("%c ",p->data);
      ++top;
      s[top]=p;
      
      p=p->lchild ;
     } /*p移向左孩子*/
     else /*栈非空*/
     {
           p=s[top];
           --top;
        p=p->rchild;
     }
   }
}

 

二叉树的 中序遍历,递归、非递归的实现:

 

/* 中序遍历的递归实现 */
void Inorder(BTNode *bt)
{
  if (bt)
  {
      Inorder(bt->lchild);
    printf("%c ",bt->data); /* 访问根结点 */
    Inorder(bt->rchild);
  }
} /* inorder */

/* 中序遍历的非递归实现 */
void Inorder_recursive1(BTNode *bt )
{
        BTNode* p,*s[MAXNUM+1];
        int top;
        p=bt;
        top=-1;
      while(p||top != -1)
      {
          if(p)
          {
               ++top;
         s[top]=p;
         p=p->lchild ;
      } /*p移向左孩子*/
      else /*栈非空*/
      {
           p=s[top];
           --top;
                printf("%c ",p->data);
        p=p->rchild;
      }
        }
}

/* 中序遍历的非递归实现 */
void Inorder_recursive2(BTNode *bt)
{
        BTNode* p,*s[MAXNUM+1];
        int top;
        p=bt;
        top=-1;

        while(p||top != -1)
        {
            if(p && p->lchild)
            {
                ++top;
                s[top] = p;
                p = p->lchild;
            }
            else
            {
                if (p)
                    printf("%c ", p->data);
                if (p && p->rchild )
                {
                    p = p->rchild;
                }
                else if ( top >= 0)
                {
                    p = s[top];
                    top--;
                    printf("%c ", p->data);
                    p = p->rchild;
                }
                else
                    break;
            }
        }
}

 

二叉树的 后序遍历,递归、非递归的实现:

 

/* 后序遍历的递归实现 */
void Postorder(BTNode *bt)
{
     if (bt)
     {
         Postorder(bt->lchild);
      Postorder(bt->rchild);
      printf("%c ",bt->data);
  }
}
/* 后序遍历的非递归实现 */
void Postorder_recursive(BTNode *pt)
{
    BTNode *s[MAXNUM+1];
    int top = -1;

    BTNode *p = pt;
    BTNode *pre = NULL;

    while ( p || top != -1 )
    {
        if (p )
        {
            ++top;
            s[top] = p;
            p = p->lchild;
            pre = p;
        }
        else
        {
            p = s[top];
        
//    --top;



            if ( p->rchild == NULL || p->rchild == pre )
            {
                p = s[top];
                --top;
                printf("%c ", p->data);
                pre =p;
                p = NULL;
            }
            else
            {
                p = p->rchild;
                pre = p;
            }
        }
    }
}        

层次遍历:

 

 

/*层次遍历二叉树*/
void LevelOrder(BTNode *bt)
{
    BTNode* queue[100];
  int front=0,rear=0;
  
  if (bt==NULL)
      return;
  
  queue[rear]=bt;
  rear++;
    
    do
    {
        printf("%c ",queue[front]->data);
    
    /*访问队首结点的数据域*/
    if (queue[front]->lchild!=NULL)
    /*将队首结点的左孩子结点入队列*/
    {
        queue[rear]=queue[front]->lchild;
        rear++;
    }
    
    if (queue[front]->rchild!=NULL)
    /*将队首结点的右孩子结点入队列*/
      {
          queue[rear]=queue[front]->rchild;
          rear++;
      }
      front++;
  }while(front!=rear);
}

阅读(754) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~