必备算法之二叉排序树

二叉查找树(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\n");
 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 }

 

posted @ 2018-01-21 15:24  yuxiaoba  阅读(279)  评论(0编辑  收藏  举报