一:定义
二叉搜索树也称为二叉排序树和二叉查找树(BST)
二叉搜索树:一颗二叉树,可以为空,也可以不为空,满足以下性质
-
非空左子树的所有键值小于其根节点的键值。
-
非空右子树的所有键值大于其根节点的键值。
-
左、右子树都是二叉搜索树,且根节点不重合。
二:基本操作
查找
- 查找最大值:查找最左边即为最大值。
- 查找最小值:查找最右边即为最小值。
插入
- 注意:不能插入一样的节点
删除【比较麻烦】
- 若删除该节点是叶子节点,则直接删除,并再修改其父节点指针置为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 //(" "); 127 128 }