• 必备算法之二叉排序树


    二叉查找树(Binary Search Tree),(又二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。

    二叉排序树结构定义

    1 typedef int ElementType;
    2 typedef struct TNode *Position;
    3 typedef Position BinTree;
    4 struct TNode
    5 {
    6     ElementType Data;
    7     BinTree Left;
    8     BinTree Right;
    9 };

    1、二叉排序树插入操作

     1 BinTree Insert( BinTree BST, ElementType X )
     2 {
     3     //将X插入二叉搜索树BST并返回结果树的根结点指针
     4     if(!BST)
     5     {
     6         BST = (BinTree)malloc(sizeof(struct TNode));
     7         BST ->Data = X;
     8         BST ->Left = BST ->Right = NULL;
     9     }
    10     else
    11     {
    12         if(X < BST ->Data )
    13         {
    14             BST ->Left = Insert(BST ->Left, X);
    15         }
    16         else if(X > BST ->Data )
    17         {
    18             BST ->Right = Insert(BST ->Right, X);
    19         }
    20 
    21     }
    22     return BST;
    23 
    24 }

    2、二叉排序树删除操作(这个好像比较难唉)

     1 BinTree Delete( BinTree BST, ElementType X )
     2 {
     3     /*将X从二叉搜索树BST中删除,并返回结果树的根结点指针;
     4     如果X不在树中,则打印一行Not Found并返回原树的根结点指针*/
     5     Position Tmp;
     6     if(!BST)    printf("Not Found
    ");
     7     else
     8     {
     9         if( X < BST->Data)
    10             BST ->Left = Delete(BST->Left, X);          /* 左子树递归删除 */
    11         else if(X > BST->Data )
    12             BST ->Right = Delete(BST->Right, X);        /* 右子树递归删除*/
    13         else                                            /* 找到需要删除的结点 */
    14         {
    15             if(BST->Left && BST->Right)                 /* 被删除的结点有左右子结点 */
    16             {
    17                 Tmp=FindMin(BST->Right);                /* 在右子树中找到最小结点填充删除结点 */
    18                 BST->Data = Tmp ->Data;
    19                 BST->Right=Delete(BST->Right,BST->Data);/* 递归删除要删除结点的右子树中最小元素 */
    20             }
    21             else                                        /* 被删除结点有一个或没有子结点*/
    22             {
    23                 Tmp = BST;
    24                 if(!BST->Left) BST = BST->Right;        /*有右孩子或者没孩子*/
    25                 else if(!BST->Right)    BST = BST->Left;/*有左孩子,一定要加else,不然BST可能是NULL,会段错误*/
    26                 free(Tmp);                              /*如无左右孩子直接删除*/
    27             }
    28         }
    29     }
    30     return BST;
    31 }

    3、二叉树排序查找操作

     1 Position Find( BinTree BST, ElementType X )
     2 {
     3     //在二叉搜索树BST中找到X,返回该结点的指针;如果找不到则返回空指针;
     4     if( !BST )
     5     {
     6         return NULL;
     7     }
     8     else if( BST->Data==X )
     9     {
    10         return BST;
    11     }
    12     else if( X < BST->Data)
    13     {
    14         return Find( BST->Left,X);
    15     }
    16     else
    17     {
    18         return Find( BST->Right,X);
    19     }
    20 }

    4、最小结点

     1 Position FindMin( BinTree BST )
     2 {
     3     //返回二叉搜索树BST中最小元结点的指针;
     4     if(BST)
     5     {
     6         while( BST->Left )
     7         {
     8             BST = BST->Left;
     9         }
    10     }
    11     return BST;
    12 }

    5、最大结点

     1 Position FindMax( BinTree BST )
     2 {
     3     //返回二叉搜索树BST中最大元结点的指针
     4     if(BST)
     5     {
     6         while( BST->Right )
     7         {
     8             BST = BST->Right;
     9         }
    10     }
    11     return BST;
    12 }
    在这个国度中,必须不停地奔跑,才能使你保持在原地。如果想要寻求突破,就要以两倍现在速度奔跑!
  • 相关阅读:
    一个中型项目:本地校园App
    我的项目:一个chrome插件的诞生记,名字叫jumper
    计算机天才Aaron Swartz 名作 《如何提高效率》——纪念真正的“hacker"!
    Linux技巧总结(个人经验版)
    C++最后课程项目总结
    从windows到Linux-ubuntu新手
    笔迹之始
    Partitioning
    Join vs merge vs lookup
    IBM InfoSphere DataStage and QualityStage
  • 原文地址:https://www.cnblogs.com/yuxiaoba/p/8324365.html
Copyright © 2020-2023  润新知