zoukankan      html  css  js  c++  java
  • 数据结构--二叉查找树的思想与实现

       二叉查找树(Binary Search Tree)又称二叉排序树(Binary Sort Tree)或者二叉搜索树,定义如下:

       二叉查找树或者是一棵空树,或者是具有下列性质的二叉树(一个结点不能多余两个儿子):
    (1)若左子树不空,则左子树上所有结点的值均小于或等于它的根结点的值;
    (2)若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值;
    (3)左、右子树也分别为二叉排序树;
     
       如下图所示,便是一颗二叉查找树:

      二叉查找树的基本操作有寻找最大值,最小值,查找指定的值,插入元素,删除元素等等,均可以用递归的方法实现,具体代码如下:

    #include <iostream>
    
    using namespace std;
    
    typedef struct TreeNode *SearchTree;
    typedef struct TreeNode *Position;
    
    struct TreeNode
    {
      int Element;
      SearchTree Left;
      SearchTree Right;
    };
    
    //////////////函数声明//////////////////////////
    void MakeEmpty (SearchTree T);  //清空一个树
    SearchTree CreatTree (int x);    //创建一个根为x的空树
    Position Find(int x, SearchTree T);     //查找函数
    Position FindMin(SearchTree T);         //寻找二叉树的最小值
    Position FindMax(SearchTree T);         //寻找二叉树的最大值
    SearchTree Insert(int x, SearchTree T);   //插入元素
    SearchTree Delete(int x, SearchTree T);    //删除元素
    
    
    //////////////函数定义//////////////////////////
    void MakeEmpty (SearchTree T)
    {
       if (T != NULL)
       {
          MakeEmpty(T->Left);
          MakeEmpty(T->Right);
         delete T;// free(T);
       }
       
    }
    SearchTree CreatTree (int x)
    {
       SearchTree T;
       T = static_cast<SearchTree>(malloc(sizeof(struct TreeNode)));
       T->Element = x;
       T->Left = NULL;
       T->Right = NULL;
       return T;
    }
    Position Find(int x, SearchTree T)
    {
       if(T == NULL)
       {
          return NULL;
       }
       if(x < T->Element )
       {
          return Find (x,T->Left );  //尾递归
       }
       else
       {
          if(x > T->Element)
          {
             return Find (x,T->Right );
          }
          else
          {
             return T;
          }
       }
    
    }
    
    Position FindMin(SearchTree T)
    {
       if(T == NULL)
       {
          return NULL;
       }
       else
       {
          if(T->Left == NULL)
          {
             return T;
          }
          else
          {
             return FindMin(T->Left );
          }
       }
    }
    
    Position FindMax(SearchTree T)
    {
       if(T != NULL)
       {
         while(T->Right != NULL)
         {
            T = T->Right;
         }
       }
       return T;
    }
    
    SearchTree Insert(int x, SearchTree T)
    {
        if(T == NULL)
        {
           T = static_cast<SearchTree>(malloc(sizeof(struct TreeNode)));
           if(T == NULL)
           {
              cout << "out of space" << endl;
           }
           else
           {
              T->Element = x;
              T->Left = NULL;
              T->Right = NULL;
           }
        }
        else
        {
          if(x < T->Element )
          {
             T->Left = Insert(x,T->Left );
          }
          else
          {
             if(x > T->Element)
             {
                T->Right = Insert(x,T->Right);
             }
          }
        }
        return T;
    }
    
    SearchTree Delete(int x, SearchTree T)
    {
       Position TmpCell;
       if (T == NULL)
       {
          cout << "Element not found" << endl;
       }
       else
       {
          if(x < T->Element)
          {
            T->Left = Delete(x, T->Left);
          }
          else
          {
             if(x > T->Element)
             {
                T->Right = Delete(x, T->Right);
             }
             else   //此处找到了要删除的元素
             {
                 if(T->Left && T->Right )    //如果这个节点有两个儿子
                 {
                    TmpCell = FindMin(T->Right );
                    T->Element = TmpCell->Element ;
                    T->Right = Delete(T->Element , T->Right );
                 }
                 else    //一个儿子或者没有儿子
                 {
                    TmpCell = T;
                    if(T->Left  == NULL)
                    {
                       T = T->Right ;
    
                    }
                    else
                    {
                       if(T->Right == NULL)
                       {
                          T = T->Left ;
                       }
                    }
                    free (TmpCell);
                 }
             }
          }
       }
       return T;
    }
    
    int main ()
    {
    //////////////测试//////////////////////
       SearchTree Tree_1 = CreatTree(6);
       Tree_1 = Insert(2,Tree_1);
       Tree_1 = Insert(8,Tree_1);
       Tree_1 = Insert(1,Tree_1);
       Tree_1 = Insert(4,Tree_1);
       Tree_1 = Insert(3,Tree_1);
    /*///////////////上面的二叉树为////////////////////////////
                            6
                          /   
                         2     8
                       /   
                      1     4
                           /
                          3 
    ///////////////////////////////////////////////////////*/
       cout << FindMax(Tree_1)->Element << endl;
       cout << FindMin(Tree_1)->Element << endl;
       cout << Find(2,Tree_1)->Right->Element << endl;
       MakeEmpty (Tree_1);
        return 0;
    }
    

      

        上面的函数多用递归实现,好好分析这些函数有利于理解递归的含义。

        夜深了,我该怎么办?

  • 相关阅读:
    VWG中设置URL编码的方法
    wordwrap breakword
    iis6下配置支持.net4.0&发布网站[转]
    MySQL修复打不开的视图定义
    DHTML CSS+JavaScript设计网页链接提示ToolTips
    C# 计算文件的MD5值
    .Net+IIS环境经常出现的问题及排障[转]
    我的WCF之旅(1):创建一个简单的WCF程序[转]
    C#嵌套类的使用方法及特性[转]
    设置<table>的固定长度
  • 原文地址:https://www.cnblogs.com/1242118789lr/p/6729843.html
Copyright © 2011-2022 走看看