zoukankan      html  css  js  c++  java
  • 数据结构与算法李春葆之判断二叉树子树

    #include <stdio.h>
    #include <malloc.h>
    #include <stdbool.h>
    
    #define MAX_SIZE 100
    
    typedef char ElemType;
    typedef struct node
    {
        ElemType data; 
        struct node *lchild; 
        struct node *rchild;
    }BTNode; 
    
    typedef struct
    {
        char data[MAX_SIZE];
        int length; 
    }SqString;
    
    static void create_btree(BTNode *&b, char *str) 
    {
        BTNode *p;
        BTNode *St[MAX_SIZE];
        int k;
        int j = 0;
        int top = -1; 
        char ch;
    
        b = NULL; 
        ch = str[j];
        while(ch != '')
        {
            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) 
                    b = p;
                else
                {
                    switch(k)
                    {
                    case 1:
                        St[top]->lchild = p;
                        break;
                    case 2:
                        St[top]->rchild = p;
                        break;
                    }
                }
                break;
            }
           
            j++;
            ch = str[j];
        }
    }
    
    
    
    static void disp_btree(BTNode *b)
    {
        if(b != NULL)
        {
            printf("%c", b->data);
            if(b->lchild != NULL || b->rchild != NULL)
            {
                printf("("); 
                disp_btree(b->lchild); 
                if(b->rchild != NULL)
                    printf(",");
                disp_btree(b->rchild);
                printf(")"); 
            }
        }
    }
    static void destroy_btree(BTNode *&b)
    {
        if(b != NULL)
        {
            destroy_btree(b->lchild);
            destroy_btree(b->rchild);
            free(b);
        }
    }
    static BTNode *left_child_node(BTNode *b)
    {
        return b->lchild;
    }
    static BTNode *right_child_node(BTNode *b)
    {
        return b->rchild;
    }
    static BTNode *find_node(BTNode *b, ElemType x) 
    {
        BTNode *p;
    
        if(b == NULL)
            return NULL;
        else if(b->data == x)
            return b;
        else
        {
            p = find_node(b->lchild, x);
            if(p != NULL)
                return p;
            else
                return find_node(b->rchild, x);
        }
    }
    static int btree_height(BTNode *b)
    {
        int left_child_height, right_child_height;
    
        if(b == NULL) 
            return 0;
        else
        {
           
            left_child_height = btree_height(b->lchild);
            right_child_height = btree_height(b->rchild);
            return (left_child_height > right_child_height) ? (left_child_height + 1) : (right_child_height + 1);
        }
    }
    static void str_assign(SqString &s, char cstr[])
    {
        int i;
    
        for(i = 0; cstr[i] != ''; i++)
            s.data[i] = cstr[i];
        s.length = i;
    }
    static void destroy_str(SqString &s)
    {
    	
    }
    static void str_copy(SqString &s, SqString t)
    {
        int i;
        for(i = 0; i < t.length; i++)
            s.data[i] = t.data[i];
        s.length = t.length;
    }
    static bool str_equal(SqString s, SqString t)
    {
        bool same = true;
        if(s.length != t.length)
            same = false;
        else
        {
             for(int i = 0; i < s.length; i++)
             {
                 if(s.data[i] != t.data[i]) 
                 {
                     same = false;
                     break;
                 }
             }
        }
        return same;
    }
    static int str_length(SqString s)
    {
        return s.length;
    }
    static SqString str_concat(SqString s, SqString t)
    {
         int index;
         SqString str;
    
         str.length = 0;
         for(index = 0; index < s.length; index++) 
            str.data[index] = s.data[index];
         for(index = 0; index < t.length; index++) 
            str.data[s.length + index] = t.data[index];
         str.length = s.length + t.length;
    
         return str;
    }
    
    static void disp_str(SqString s)
    {
        int i;
    
        if(s.length > 0)
        {
            for(i = 0; i < s.length; i++)
            {
                printf("%c", s.data[i]);
            }
            printf("
    ");
        }
    }
    
    int i;                                            
    static SqString pre_order_seq(BTNode *b)
    {
        SqString str;
        SqString left_str;
        SqString str1;
        SqString right_str;
    
        if(b == NULL)                           
        {
            str_assign(str, "#");               
            return str;
        }
        str.data[0] = b->data;                 
        str.length = 1;
        left_str = pre_order_seq(b->lchild);
        str1 = str_concat(str, left_str);
        right_str = pre_order_seq(b->rchild);
        str = str_concat(str1, right_str);
    
        return str;
    }
    static BTNode *create_pre_seq(SqString str)
    {
        BTNode *b;
        char value;
    
        if(i >= str.length)                     
            return NULL;
    
        value = str.data[i];                 
        printf("create_pre_seq %c
    ", value);
        i++;
        if(value == '#')                        
            return NULL;
        b = (BTNode *)malloc(sizeof(BTNode));   
        b->data = value;
        b->lchild = create_pre_seq(str);        
        b->rchild = create_pre_seq(str);       
    
        return b;                              
    }
    static void get_next(SqString t, int next[])
    {
        int j = 0;
        int k = -1;
        next[0] = -1;
        while(j < t.length - 1)
        {
             if(k == -1 || t.data[j] == t.data[k])
             {
                 j++;
                 k++;
                 next[j] = k;
             }
             else
                  k = next[k];
        }
    }
    static int KMP_index(SqString s, SqString t)
    {
        int i = 0;
        int j = 0;
        int next[MAX_SIZE];
    
        get_next(t, next);
        while(j < s.length && j < t.length)
        {
            if(j == -1 || s.data[i] == t.data[j])
            {
                
                 i++;
                 j++;
            }
            else
                 j = next[j]; 
        }
        if(j >= t.length)
            return (i - t.length); 
        else
            return -1; 
    }
    static bool is_sub_tree(BTNode *b1, BTNode *b2)            
    {
        SqString s1 = pre_order_seq(b1);                        
        SqString s2 = pre_order_seq(b2);                       
    
        if(KMP_index(s1, s2) != -1)                             
            return true;
        else                                                    
            return false;
    }
    int main(void)
    {
        BTNode *b1, *b2;
        create_btree(b1, "A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))");
        printf("二叉树b1:");
        disp_btree(b1);
        printf("
    ");
        create_btree(b2, "O(P,Q(,R))");
        printf("二叉树b2:");
        disp_btree(b2);
        printf("
    ");
        if(is_sub_tree(b1, b2))
            printf("结果:b2是b1的子树
    ");
        else
            printf("结果:b2不是b1的子树
    ");
        destroy_btree(b1);
        destroy_btree(b2);
        return 0;
    }
    
  • 相关阅读:
    将excel中的sheet1导入到sqlserver中
    .net中 Timer定时器
    Exception异常处理机制
    算法
    八、上网行为管理
    获取网站路径绝对路径的方法汇总
    Window逆向基础之逆向工程介绍
    Java Web代码审计流程与漏洞函数
    创建一个Java Web项目,获取POST数据并显示
    七、虚拟专用网
  • 原文地址:https://www.cnblogs.com/AmosAlbert/p/12832255.html
Copyright © 2011-2022 走看看