【第九周】项目3-利用二叉树遍历思想解决问题(2)

来源:互联网 发布:java重写hashcode方法 编辑:程序博客网 时间:2024/06/06 08:31
  1. #include <stdio.h>    
  2. #include "btree.h"    
  3.     
  4. int Like(BTNode *b1,BTNode *b2)  //判断二叉树b1和b2是否相似    
  5. {    
  6.     int like1,like2;    
  7.     if (b1==NULL && b2==NULL)    //如果两二叉树都为空,相似    
  8.         return 1;    
  9.     else if (b1==NULL || b2==NULL)  //如果两二叉树其中一个为空,不相似    
  10.         return 0;    
  11.     else                          //两二叉树的左右子树分别逐个比较得是否相似    
  12.     {    
  13.         like1=Like(b1->lchild,b2->lchild);    
  14.         like2=Like(b1->rchild,b2->rchild);    
  15.         return (like1 & like2);    
  16.     }    
  17. }    
  18.     
  19. int main()    
  20. {    
  21.     BTNode *b1, *b2, *b3;    
  22.     CreateBTNode(b1,"B(D,E(H(J,K(L,M(,N)))))");    
  23.     CreateBTNode(b2,"A(B(D(,G)),C(E,F))");    
  24.     CreateBTNode(b3,"u(v(w(,x)),y(z,p))");    
  25.     if(Like(b1, b2))    
  26.         printf("b1和b2相似\n");    
  27.     else    
  28.         printf("b1和b2不相似\n");    
  29.     if(Like(b2, b3))    
  30.         printf("b2和b3相似\n");    
  31.     else    
  32.         printf("b2和b3不相似\n");    
  33.     DestroyBTNode(b1);    
  34.     DestroyBTNode(b2);    
  35.     DestroyBTNode(b3);    
  36.     return 0;    
  37. }    
#ifndef BTREE_H_INCLUDED    #define BTREE_H_INCLUDED        #define MaxSize 100    typedef char ElemType;    typedef struct node    {        ElemType data;              //数据元素        struct node *lchild;        //指向左孩子        struct node *rchild;        //指向右孩子    } BTNode;    void CreateBTNode(BTNode *&b,char *str);        //由str串创建二叉链    BTNode *FindNode(BTNode *b,ElemType x);     //返回data域为x的节点指针    BTNode *LchildNode(BTNode *p);      //返回*p节点的左孩子节点指针    BTNode *RchildNode(BTNode *p);      //返回*p节点的右孩子节点指针    int BTNodeDepth(BTNode *b);     //求二叉树b的深度    void DispBTNode(BTNode *b);     //以括号表示法输出二叉树    void DestroyBTNode(BTNode *&b);     //销毁二叉树        #endif // BTREE_H_INCLUDED    

#include <stdio.h>    #include <malloc.h>    #include "btree.h"        void CreateBTNode(BTNode *&b,char *str)     //由str串创建二叉链    {        BTNode *St[MaxSize],*p=NULL;        int top=-1,k,j=0;        char ch;        b=NULL;             //建立的二叉树初始时为空        ch=str[j];        while (ch!='\0')    //str未扫描完时循环        {            switch(ch)            {            case '(':                top++;                St[top]=p;                k=1;                break;      //为左节点            case ')':                top--;                break;            case ',':                k=2;                break;                          //为右节点            default:                p=(BTNode *)malloc(sizeof(BTNode));                p->data=ch;                p->lchild=p->rchild=NULL;                if (b==NULL)                    //p指向二叉树的根节点                    b=p;                else                            //已建立二叉树根节点                {                    switch(k)                    {                    case 1:                        St[top]->lchild=p;                        break;                    case 2:                        St[top]->rchild=p;                        break;                    }                }            }            j++;            ch=str[j];        }    }    BTNode *FindNode(BTNode *b,ElemType x)  //返回data域为x的节点指针    {        BTNode *p;        if (b==NULL)            return NULL;        else if (b->data==x)            return b;        else        {            p=FindNode(b->lchild,x);            if (p!=NULL)                return p;            else                return FindNode(b->rchild,x);        }    }    BTNode *LchildNode(BTNode *p)   //返回*p节点的左孩子节点指针    {        return p->lchild;    }    BTNode *RchildNode(BTNode *p)   //返回*p节点的右孩子节点指针    {        return p->rchild;    }    int BTNodeDepth(BTNode *b)  //求二叉树b的深度    {        int lchilddep,rchilddep;        if (b==NULL)            return(0);                          //空树的高度为0        else        {            lchilddep=BTNodeDepth(b->lchild);   //求左子树的高度为lchilddep            rchilddep=BTNodeDepth(b->rchild);   //求右子树的高度为rchilddep            return (lchilddep>rchilddep)? (lchilddep+1):(rchilddep+1);        }    }    void DispBTNode(BTNode *b)  //以括号表示法输出二叉树    {        if (b!=NULL)        {            printf("%c",b->data);            if (b->lchild!=NULL || b->rchild!=NULL)            {                printf("(");                DispBTNode(b->lchild);                if (b->rchild!=NULL) printf(",");                DispBTNode(b->rchild);                printf(")");            }        }    }    void DestroyBTNode(BTNode *&b)   //销毁二叉树    {        if (b!=NULL)        {            DestroyBTNode(b->lchild);            DestroyBTNode(b->rchild);            free(b);        }    }    


阅读全文
0 0
原创粉丝点击