一:定义
二叉搜索树也称为二叉排序树和二叉查找树(BST)
二叉搜索树:一颗二叉树,可以为空,也可以不为空,满足以下性质
-
非空左子树的所有键值小于其根节点的键值。
-
非空右子树的所有键值大于其根节点的键值。
-
左、右子树都是二叉搜索树,且根节点不重合。
二:基本操作
查找
- 查找最大值:查找最左边即为最大值。
- 查找最小值:查找最右边即为最小值。
插入
注意:不能插入一样的节点
删除【比较麻烦】
若删除该节点是叶子节点,则直接删除,并再修改其父节点指针---置为NULL
若删除该节点是带有一个儿子节点,则将其父节点的指针指向要删除结点的孩子结点
若删除该节点是带有左右二个二叉树,则用一个结点替代被删除结点:右子树的最小元素 或者 左子树最大元素。
三:代码
#include<stdio.h>#include<stdlib.h>typedef struct TreeNode* SearchTree;typedef struct TreeNode* Position;struct TreeNode{ int data; SearchTree Left, Right;};SearchTree MakeEmpty(SearchTree T){ if (T!= NULL) { MakeEmpty(T->Left); MakeEmpty(T->Right); free(T); } return NULL;}SearchTree Find(int x, SearchTree T){ if (T == NULL) return NULL; if (T->data < x) { return Find(x, T->Right); } else if (T->data > x) { return Find(x, T->Left); } else { return T; }}Position FindMin(SearchTree T){ if (T == NULL) return NULL; else if (T->Left == NULL) { return T; } else { return FindMin(T->Left); }}Position FindMax(SearchTree T){ if (T == NULL) return NULL; else if (T->Right == NULL) { return T; } else { return FindMax(T->Right); }}SearchTree Insert(SearchTree T, int X){ if (T == NULL) { T = (SearchTree)malloc(sizeof(struct TreeNode)); T->data = X; T->Left = T->Right = NULL; } else if (T->data > X) { T->Left = Insert(T->Left, X); } else if (T->data < X) { T->Right = Insert(T->Right, X); } return T;}SearchTree Delete(SearchTree T, int X){ Position TmpCell; if (T == NULL) { return NULL; } else if (T->data > X) { T->Left = Delete(T->Left, X); } else if (T->data < X) { T->Right = Delete(T->Right, X); } else if (T->Left != NULL && T->Right != NULL) { TmpCell = FindMin(T->Right); T->data = TmpCell->data; T->Right = Delete(T->Right, T->data); } else { TmpCell = T; if (T->Left == NULL) { T = T->Right; } else if (T->Right == NULL) { T = T->Left; } free(TmpCell); } return T;}void InOrderTraversal(SearchTree T){ if (T) { InOrderTraversal(T->Left); printf("%5d", T->data); InOrderTraversal(T->Right); } //("\n");}