數據結構——二叉樹、二叉查找樹

 

參考:Mark Allen Weiss 著《數據結構與算法分析——C語言描述》(第二版)算法

主要內容:二叉樹及二叉查找樹數據結構

1、二叉樹函數

1 二叉樹定義spa

  二叉樹是一棵每一個節點都不能有多於兩個兒子的樹指針

2 實現code

  2.1 實現思路blog

    由於一個二叉樹最多有兩個兒子,因此咱們能夠用指針直接指向它們。遞歸

  2.2 實現代碼it

typedef struct TreeNode *PtrToNode; typedef struct PtrToNode Tree; struct TreeNode { int Element; Tree Left; Tree Right; };

2、二叉查找樹
io

1 二叉查找樹的定義

  二叉查找樹是一棵特殊的二叉樹。對於數中的每一個節點X,它的左子樹中全部關鍵字值小於X的關鍵字;

而它的右子樹中全部關鍵字值大於X的關鍵字。圖1中,只有左邊的二叉樹是二叉查找樹。由於右邊的樹在關鍵字爲6的節點的左子樹中有個節點的關鍵字爲7,大於6。

    

                        圖1 兩棵二叉樹

 

2 基本操做

  函數聲明代碼

 1  1 #ifndef BINARY_SEARCH_TREE_H_INCLUDED
 2  2 #define BINARY_SEARCH_TREE_H_INCLUDED
 3  3 #include <stdio.h>
 4  4 #include <stdlib.h>
 5  5 
 6  6     struct TreeNode;
 7  7     typedef struct TreeNode *Position;
 8  8     typedef struct TreeNode *SearchTree;
 9  9 
10 10     SearchTree MakeEmpty(SearchTree T);
11 11     Position Find(int X,SearchTree T);
12 12     Position FindMin(SearchTree T);
13 13     Position FindMax01(SearchTree T);
14 14     Position FindMax02(SearchTree T);
15 15     SearchTree Insert(int X,SearchTree T);
16 16     SearchTree Delete(int X,SearchTree T);
17 17     void Retrieve01(Position P);
18 18     int Retrieve(Position P);
19 19 #endif // BINARY_SEARCH_TREE_H_INCLUDED

 

  2.1 初始化操做(MakeEmpty)

    2.1.1 實現思路

      建立一個空樹。

    2.1.2 僞代碼  

 1 /*創建一棵空樹的例程*/
 2 SearchTree MakeEmpty(SearchTree T)
 3 {
 4     if(NULL != T)
 5     {
 6         MakeEmpty(T->Left);
 7         MakeEmpty(T->Right);
 8         free(T);
 9     }
10     return NULL;
11 }

  2.2 查找操做(Find)

    2.2.1 實現思路見圖1。

      

                                                                              圖2 Find實現思路

 

      注意:通常返回指向樹T中具備關鍵字X的節點的指針,若是這樣的節點不存在則返回NULL   

 

    2.2.2 僞代碼

 1 /*二叉查找樹獲得Find操做*/
 2 Position Find(int X,SearchTree T)
 3 {
 4     if(NULL == T)
 5     {
 6         return NULL;
 7     }
 8     if(X < T->Element)
 9     {
10         Find( X,T->Left);
11     }else if(X > T->Element)
12     {
13         Find( X,T->Right);
14     }else{
15         return T;
16     }
17 }

 

   2.2.3 補充

    由Find操做延伸出查找最小值操做(FindMin)和查找最大值操做(FindMax)。

               (1)查找最小值操做(FindMin)

      基本思路爲:從根開始而且只要有左兒子就對左子樹進行Find操做,返回值爲指向最小值節點的指針。實現代碼以下,

 1 /*對二叉查找樹的FindMin的遞歸實現*/
 2 Position FindMin(SearchTree T)
 3 {
 4     if(NULL == T){
 5         return NULL;}
 6     if(NULL == T->Left)
 7     {
 8         return T;
 9     }else{
10         return FindMin(T->Left);
11     }
12 }

               (2)查找最小值操做(FindMax)

      基本思路爲:從根開始而且只要有右兒子就對右子樹進行Find操做,返回值爲指向最大值節點的指針。實現代碼以下,

/*對二叉查找樹的FindMax的遞歸實現*/
Position FindMax01(SearchTree T)
{
    if(NULL == T){
        return NULL;}
    if(NULL == T->Right)
    {
        return T;
    }else{
        return FindMin(T->Right);
    }
}
/*對二叉查找樹的FindMax的非遞歸實現*/
Position FindMax02(SearchTree T)
{
    if(NULL != T){
        while(T->Right != NULL)
        {
            T=T->Right;
        }
    }
    return T;
}

 

  2.3 插入操做(Insert) 

    2.3.1 實現思路如圖3

            

                     圖3 插入操做實現思路

    2.3.2 實現代碼以下,

 1 /*插入元素到二叉查找樹的例程*/
 2 SearchTree Insert(int X,SearchTree T)
 3 {
 4     if(NULL == T)
 5     {
 6         T = (struct TreeNode *)malloc(sizeof(struct TreeNode));
 7         if( T == NULL )
 8         {
 9             perror("Out Of Space!!!");
10         }else{
11             T->Element = X;
12             T->Left = NULL;
13             T->Right = NULL;
14         }
15     }else if( X > T->Element)
16     {
17         T->Right = Insert( X,T->Right);
18     }else if( X < T->Element)
19     {
20         T->Left = Insert( X,T->Right);
21     }
22     return T;
23 }

  

  2.4 刪除操做(Delete) 

    2.4.1 實現思路如圖4

            

 

                     圖4 刪除操做實現思路

    2.4.2 實現代碼以下,

/*二叉查找樹的刪除例程*/
SearchTree Delete(int X,SearchTree T)
{
    Position TmpCell;
    if(NULL == T)
    {
        perror("Element is not found");
    }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;
}
相關文章
相關標籤/搜索