二叉查找树的相关概念
- 使二叉树变为二叉查找树的性质是:**对于树中的每个节点X,他的左子树中所有关键字都小于该节点关键值,对于右子树中所有关键字值都大于该节点的关键值
- 二叉查找树的平均深度为O(logN)
- 二叉查找树的节点定义与二叉树的节点定义相同:
struct TreeNode{
ElementType Element;
TreeNode* Left;
TreeNode* Right;
}
二叉树的相关操作
TreeNode* MakeEmpty(TreeNode* T){
if(T!=NULL){
MakeEmpty(T->Left);
MakeEmpty(T->Right);
free(T);
}
return NULL;
- 二叉查找树的Find操作
这个操作一般需要返回指向树T中具有关键字X的节点的指针,如果这样的节点不存在,那么返回NULL,
TreeNode* Find(TreeNode* T,int X){
if(T==NULL)
return NULL;
if(X<T->Element)
return Find(T->Left,X);
else if(X>T->Element)
return Find(T->Right,X);
else
return T;
TreeNode*FindMin(TreeNode* T) {
if (T == NULL)
return NULL;
else if (T->Left == NULL)
return T;
else
return FindMin(T->Left);
}
TreeNode*FindMax(TreeNode* T) {
if (T == NULL)
return NULL;
else if (T->Right == NULL)
return T;
else
return FindMax(T->Right);
}
TreeNode*Insert(int X, TreeNode* T) {
if (T == NULL) {
T = new TreeNode;
T->element = X;
T->Left = NULL;
T->Right = NULL;
return T;
}
else if(X<T->Left->element) {
/*return Insert(X, T->Left);*/
T->Left = Insert(X, T->Left);
}
else if(X>T->element){
/*return Insert(X, T->Right);*/
T->Right = Insert(X, T->Right);
}
return T;
}
- 删除操作
删除操作分为几种情况讨论:
(1)要删除的是叶节点:直接删除即可
(2)要删除的节点只有一个儿子:将指针绕过父节点,然后删除
(3)要删除的节点有两个儿子:用该节点右子树中最小的节点补上
TreeNode*Delete(int X, TreeNode* T) {
TreeNode* P;
if (T == NULL)
return NULL;
else if (X < T->element)
T->Left = Delete(X, T->Left);
else if (X > T->element)
T->Right = Delete(X, T->Right);
//对所删除的节点三种情况的处理
else if (T->Left && T->Right) {
P = FindMin(T->Right);
T->element = P->element;
T->Right = Delete(T->element, T->Right);
}
else {
P = T;
if (T->Left == NULL)
T = T->Right;
else if (T->Right == NULL)
T = T->Left;
delete T;
}
return T;
}