• 004 -- Binary search Tree


    000 - search tree 

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

    #define datatype int
    typedef struct Node{
    datatype data;
    struct Node *lchild;
    struct Node *rchild;
    }bintree;

    //create tree

    bintree* createbinarytree(data)
    {
    bintree* t = (bintree*)malloc(sizeof(bintree));
    if(!t)
    {
    printf("Not enough space ");
    return NULL;
      }
    t->lchild = NULL;
    t->rchild = NULL;
    t->data = data;
    return t;
    }

    bintree search_tree(bintree t, datatype x){
    if(!t) {return NULL;} if(t->data == x) return t; else: { if(!search_tree(t->lchild,x)) {return search_tree(t->rchild,x);} return t; } }

    002 --  count the nodes in the tree 

    int count_tree(bintree t)
    {
      if(t)
      {
         return (count_tree(t->lchild)+ count_tree(t->rchild)+1);
      }
    
      return 0;
    
    
    }

    003 -- compare 2 binary trees 

    int is_equal(bintree t1, bintree t2)
    {
      if(!t1 && !t2)
      { return 1 ;} // both tree is empty, equal 
    
      if(t1 && t2 && t1-->data == t2->data) 
    //one tree is empty or there is one data is different , then break 
      {
         if(is_equal(t1->lchild,t2->lchild))
           if(is_equal(t1->rchild, t2->rchild))
              { return 1;}
      }
    
       return 0;
    
    
    }

    004 - degree check of the tree 

    int hight_tree(bintree t)
    {
      int h, left, right;
      if(!t)
      {
        return 0;
      }
    
      left = high_tree(t->lchild);
      right = high_tree(t->rchild);
      h = (left>right ? left: right) +1;
    
      return h;
    }

    005- find a element in the binary search tree 

    bintree* Find(datatype x, bintree t)
    {
      while(t)
      {
        if(x>t->data)
          t = t->rchild;
        else if(x < t->data)
          t = t->lchild;
        else
          return t;
      }
    
      return NULL:
    }

    006 - find the min data in the binary search tree

    bintree* FindMin(bintree* t)
    {
      if(t)
      {
        while(t->lchild)
          t = t->lchild;
      }
      return t;
    
    }

    // same for the max

    bintree* FindMax(bintree* t)
    {
    if(t)
    {
    while(t->rchild)
    t = t->rchild;
    }
    return t;

    }

    007 -- insert a node to the binary search tree 

    bintree* Insert(bintree* t, datatype x)
    {
      if(!t)
      {
        t = createbinarytree(x);
        t->lchild = NULL;
        t->rchild = NULL;
      }
      
      else
      {
        if(x>t->data)
          t ->rchild = Insert(x, t->rchild);
        else if 
          t->lchild = Insert(x, t->lchild);
      }
    
      return t;
    
    }

    008 -- delete a node 

    BinaryTree* Delete(ElementType x, BinaryTree* BST) {  
        BinaryTree* Temp;  
        if (!BST)  
            printf("
    didn't find the node to delete%d", x);  
        else if (x < BST->data)  
            BST->leftSubTree = Delete(x, BST->leftSubTree);  
        else if (x > BST->data)  
            BST->rightSubTree = Delete(x, BST->rightSubTree);  
        else { 
    // find the node to be deleted
     
            if (BST->leftSubTree && BST->rightSubTree) { 
    //the node has lchild and rchild
                Temp = FindMin(BST->rightSubTree); 
    //find the min rchild to replace the deleted node
                BST->data = Temp->data;  
                BST->rightSubTree = Delete(BST->data, BST->rightSubTree);  //delete the rchild of the deleted node 
            }  
            else { //the deleted node has 1 or no child node 
                Temp = BST;  
                if (!BST->leftSubTree) //has rchild or no child 
                    BST = BST->rightSubTree;  
                else if (!BST->rightSubTree) //has lchild or no child
                    BST = BST->leftSubTree;  
                free(Temp);  
            }  
        }  
        return BST;  
    }  
      
      
    int main(int argc, const char * argv[]) {  
        bintree* t = createbinarytree(18);  
        Insert(10, t);  
        Insert(20, t);  
        Insert(7, t);  
        Insert(15, t);  
        Insert(9, t);  
        Insert(22, t);  
          
        bintree* findBT1 = Find(15, t);  
        if (findBT1) printf("find1:%d", findBT1->data);  
          
        bintree* findBT2 = Find(22, root);  
        if (findBT2) printf("
    find2:%d", findBT2->data);  
          
        Delete(10, root);  
        bintree* findBT3 = Find(10, root);  
        if (findBT3) printf("
    find3:%d", findBT3->data);  
          
        bintree* findBT4 = Find(9, root);  
        if (findBT4) printf("
    find4:%d", findBT4->data);  
          
        Delete(9, root);  
        bintree* findBT5 = Find(9, root);  
        if (findBT5) printf("find5:%d", findBT5->data);  
          
        return 0;  
    }  

    More details:

    http://www.cnblogs.com/elaron/archive/2013/04/11/3015155.html

    http://www.cnblogs.com/fu11211129/p/4214047.html

  • 相关阅读:
    成为 Team Leader 后我最关心的那些事
    《管理的实践》读书心得
    玩黑客学校CTF
    DHCP中继器
    test
    初窥XSS跨站脚本攻击
    TCP/IP模型
    逻辑漏洞-客户端验证的邮箱-Web渗透实例之中国教育部青少年普法网站逻辑漏洞
    逻辑漏洞-支付风险-大疆某处支付逻辑漏洞可1元买无人机
    逻辑漏洞-密码找回之验证码发给了客户端
  • 原文地址:https://www.cnblogs.com/Shareishappy/p/7718859.html
Copyright © 2020-2023  润新知