数据结构之二叉搜索树

一:定义

  二叉搜索树也称为二叉排序树和二叉查找树(BST)
  二叉搜索树:一颗二叉树,可以为空,也可以不为空,满足以下性质
  1. 非空左子树的所有键值小于其根节点的键值。

  2. 非空右子树的所有键值大于其根节点的键值。

  3. 左、右子树都是二叉搜索树,且根节点不重合。

     

二:基本操作

查找

  • 查找最大值:查找最左边即为最大值。
  • 查找最小值:查找最右边即为最小值。

插入

  • 注意:不能插入一样的节点

删除【比较麻烦】

  • 若删除该节点是叶子节点,则直接删除,并再修改其父节点指针置为NULL
  • 若删除该节点是带有一个儿子节点,则将其父节点的指针指向要删除结点的孩子结点
  • 若删除该节点是带有左右二个二叉树,则用查找该节点的右子树的最小值,把当前节点设置为前面查找最小值,并删除下一个与该点的值一样的节点

三:代码

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 typedef struct TreeNode* SearchTree;
  4 typedef struct TreeNode* Position;
  5 struct TreeNode
  6 {
  7     int data;
  8     SearchTree Left, Right;
  9 };
 10 //初始化
 11 SearchTree MakeEmpty(SearchTree T)
 12 {
 13     if (T!= NULL)
 14     {
 15         MakeEmpty(T->Left);
 16         MakeEmpty(T->Right);
 17         free(T);
 18     }
 19     return NULL;
 20 }
 21 //查找
 22 SearchTree Find(int x, SearchTree T)
 23 {
 24     if (T == NULL) return NULL;
 25     if (T->data < x)
 26     {
 27         return Find(x, T->Right);
 28     }
 29     else if (T->data > x)
 30     {
 31         return Find(x, T->Left);
 32     }
 33     else
 34     {
 35         return T;
 36     }
 37 }
 38 //查找最小值
 39 Position FindMin(SearchTree T)
 40 {
 41     if (T == NULL) return NULL;
 42     else if (T->Left == NULL) { return T; }
 43     else
 44     {
 45         return FindMin(T->Left);
 46     }
 47 }
 48 //查找最大值
 49 Position FindMax(SearchTree T)
 50 {
 51     if (T == NULL) return NULL;
 52     else if (T->Right == NULL)
 53     {
 54         return T;
 55     }
 56     else
 57     {
 58         return FindMax(T->Right);
 59     }
 60 }
 61 //插入
 62 SearchTree Insert(SearchTree T, int X)
 63 {
 64     if (T == NULL)
 65     {
 66         T = (SearchTree)malloc(sizeof(struct TreeNode));
 67         T->data = X;
 68         T->Left = T->Right = NULL;
 69     }
 70     else if (T->data > X)
 71     {
 72         T->Left = Insert(T->Left, X);
 73     }
 74     else if (T->data < X)
 75     {
 76         T->Right = Insert(T->Right, X);
 77     }
 78     return T;
 79 }
 80 //删除
 81 SearchTree Delete(SearchTree T, int X)
 82 {
 83     Position TmpCell;
 84     if (T == NULL)
 85     {
 86         return NULL;
 87     }
 88     else if (T->data > X)
 89     {
 90         T->Left = Delete(T->Left, X);
 91     }
 92     else if (T->data < X)
 93     {
 94         T->Right = Delete(T->Right, X);
 95     }
 96     else if (T->Left != NULL && T->Right != NULL) //被删节点存在左、右子树
 97     {
 98         TmpCell = FindMin(T->Right);
 99         T->data = TmpCell->data;
100         T->Right = Delete(T->Right, T->data);
101     }
102     else //被删节点可能有左或者右子树 或者 是叶子节点
103     {
104         TmpCell = T;
105         if (T->Left == NULL)
106         {
107             T = T->Right;
108         }
109         else if (T->Right == NULL)
110         {
111             T = T->Left;
112         }
113         free(TmpCell);
114     }
115     return T;
116 }
117 //中序遍历
118 void InOrderTraversal(SearchTree T)
119 {
120     if (T)
121     {
122         InOrderTraversal(T->Left);
123         printf("%5d", T->data);
124         InOrderTraversal(T->Right);
125     }
126     //("\n");
127 
128 }
View Code

 

posted @ 2020-10-23 20:58  小姚yyy  阅读(47)  评论(0编辑  收藏  举报