第十周项目二 二叉树遍历的递归算法

来源:互联网 发布:网站美工需要会什么 编辑:程序博客网 时间:2024/05/16 17:01
[csharp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. /*  
  2.  *Copyright (c) 2016,烟台大学计算机学院  
  3.  *All rights reserved.  
  4.  *文件名称:btree.cpp  
  5.  *作者:衣龙川  
  6.  *完成日期:2016年11月10日  
  7.  *版本号:vc++6.0  
  8.  *  
  9.  *问题描述:二叉树遍历的递归算法  
  10.  *输入描述:无  
  11.  *程序输出:二叉树先序中序后序遍历  
  12. */    

[csharp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. btree.h  
  2. #ifndef BTREE_H_INCLUDED  
  3. #define BTREE_H_INCLUDED  
  4.  
  5. #define MaxSize 100  
  6. typedef char ElemType;  
  7. typedef struct node  
  8. {  
  9.     ElemType data;              //数据元素  
  10.     struct node *lchild;        //指向左孩子  
  11.     struct node *rchild;        //指向右孩子  
  12. } BTNode;  
  13. void CreateBTNode(BTNode *&b,char *str);        //由str串创建二叉链  
  14. BTNode *FindNode(BTNode *b,ElemType x);     //返回data域为x的节点指针  
  15. BTNode *LchildNode(BTNode *p);  //返回*p节点的左孩子节点指针  
  16. BTNode *RchildNode(BTNode *p);  //返回*p节点的右孩子节点指针  
  17. int BTNodeDepth(BTNode *b); //求二叉树b的深度  
  18. void DispBTNode(BTNode *b); //以括号表示法输出二叉树  
  19. void DestroyBTNode(BTNode *&b);  //销毁二叉树  
  20.  
  21. #endif // BTREE_H_INCLUDED  
[csharp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. btree.cpp  
  2. #include <stdio.h>  
  3. #include <malloc.h>  
  4. #include "btree.h"  
  5.   
  6. void CreateBTNode(BTNode *&b,char *str)     //由str串创建二叉链  
  7. {  
  8.     BTNode *St[MaxSize],*p=NULL;  
  9.     int top=-1,k,j=0;  
  10.     char ch;  
  11.     b=NULL;             //建立的二叉树初始时为空  
  12.     ch=str[j];  
  13.     while (ch!='\0')    //str未扫描完时循环  
  14.     {  
  15.         switch(ch)  
  16.         {  
  17.         case '(':  
  18.             top++;  
  19.             St[top]=p;  
  20.             k=1;  
  21.             break;      //为左节点  
  22.         case ')':  
  23.             top--;  
  24.             break;  
  25.         case ',':  
  26.             k=2;  
  27.             break;                          //为右节点  
  28.         default:  
  29.             p=(BTNode *)malloc(sizeof(BTNode));  
  30.             p->data=ch;  
  31.             p->lchild=p->rchild=NULL;  
  32.             if (b==NULL)                    //p指向二叉树的根节点  
  33.                 b=p;  
  34.             else                            //已建立二叉树根节点  
  35.             {  
  36.                 switch(k)  
  37.                 {  
  38.                 case 1:  
  39.                     St[top]->lchild=p;  
  40.                     break;  
  41.                 case 2:  
  42.                     St[top]->rchild=p;  
  43.                     break;  
  44.                 }  
  45.             }  
  46.         }  
  47.         j++;  
  48.         ch=str[j];  
  49.     }  
  50. }  
  51. BTNode *FindNode(BTNode *b,ElemType x)  //返回data域为x的节点指针  
  52. {  
  53.     BTNode *p;  
  54.     if (b==NULL)  
  55.         return NULL;  
  56.     else if (b->data==x)  
  57.         return b;  
  58.     else  
  59.     {  
  60.         p=FindNode(b->lchild,x);  
  61.         if (p!=NULL)  
  62.             return p;  
  63.         else  
  64.             return FindNode(b->rchild,x);  
  65.     }  
  66. }  
  67. BTNode *LchildNode(BTNode *p)   //返回*p节点的左孩子节点指针  
  68. {  
  69.     return p->lchild;  
  70. }  
  71. BTNode *RchildNode(BTNode *p)   //返回*p节点的右孩子节点指针  
  72. {  
  73.     return p->rchild;  
  74. }  
  75. int BTNodeDepth(BTNode *b)  //求二叉树b的深度  
  76. {  
  77.     int lchilddep,rchilddep;  
  78.     if (b==NULL)  
  79.         return(0);                          //空树的高度为0  
  80.     else  
  81.     {  
  82.         lchilddep=BTNodeDepth(b->lchild);   //求左子树的高度为lchilddep  
  83.         rchilddep=BTNodeDepth(b->rchild);   //求右子树的高度为rchilddep  
  84.         return (lchilddep>rchilddep)? (lchilddep+1):(rchilddep+1);  
  85.     }  
  86. }  
  87. void DispBTNode(BTNode *b)  //以括号表示法输出二叉树  
  88. {  
  89.     if (b!=NULL)  
  90.     {  
  91.         printf("%c",b->data);  
  92.         if (b->lchild!=NULL || b->rchild!=NULL)  
  93.         {  
  94.             printf("(");  
  95.             DispBTNode(b->lchild);  
  96.             if (b->rchild!=NULL) printf(",");  
  97.             DispBTNode(b->rchild);  
  98.             printf(")");  
  99.         }  
  100.     }  
  101. }  
  102. void DestroyBTNode(BTNode *&b)   //销毁二叉树  
  103. {  
  104.     if (b!=NULL)  
  105.     {  
  106.         DestroyBTNode(b->lchild);  
  107.         DestroyBTNode(b->rchild);  
  108.         free(b);  
  109.     }  
  110. }  
[csharp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. main.cpp  
  2. #include <stdio.h>
    #include "btree.h"
    void PreOrder(BTNode *b)        //先序遍历的递归算法
    {
        if (b!=NULL)
        {
            printf("%c ",b->data);  //访问根节点
            PreOrder(b->lchild);    //递归访问左子树
            PreOrder(b->rchild);    //递归访问右子树
        }
    }


    void InOrder(BTNode *b)         //中序遍历的递归算法
    {
        if (b!=NULL)
        {
            InOrder(b->lchild);     //递归访问左子树
            printf("%c ",b->data);  //访问根节点
            InOrder(b->rchild);     //递归访问右子树
        }
    }


    void PostOrder(BTNode *b)       //后序遍历的递归算法
    {
        if (b!=NULL)
        {
            PostOrder(b->lchild);   //递归访问左子树
            PostOrder(b->rchild);   //递归访问右子树
            printf("%c ",b->data);  //访问根节点
        }
    }


    int main()
    {
        BTNode *b;
        CreateBTNode(b,"A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))");
        printf("二叉树b:");
        DispBTNode(b);
        printf("\n");
        printf("先序遍历序列:\n");
        PreOrder(b);
        printf("\n");
        printf("中序遍历序列:\n");
        InOrder(b);
        printf("\n");
        printf("后序遍历序列:\n");
        PostOrder(b);
        printf("\n");
        DestroyBTNode(b);
        return 0;
    }
    运行截图:

0 0