二叉排序树
定义:
1)若它的左子树非空,则左子树的所有节点都小于它的根节点;
2)若它的右子树非空,则右子树的所有节点都小于它的根节点;
3)它的左右字数也分别为二叉排序树。
二叉排序树的创建和插入节点
代码实现
int BST_Insert(TreeNode **root, int data)
{
if(NULL == *root){
(*root) = (TreeNode *)malloc(sizeof(TreeNode));
(*root)->data = data;
(*root)->lchild = (*root)->rchild = NULL;
return OK;
}
else if(data < (*root)->data)
return BST_Insert(&(*root)->lchild,data);
else if(data > (*root)->data)
return BST_Insert(&(*root)->rchild,data);
else
return ERROR;
}
TreeNode *create_search_tree(int *arr, int size)
{
TreeNode *root;
for(int i = 0; i < size; i++)
BST_Insert(&root,arr[i]);
return root;
}
二叉排序树的节点删除
删除过程要记录删除节点(del)的父亲节点(pre),节点删除有4种情况
1)删除叶子节点,将父亲节点指向删除节点的指针置为NULL
2)删除节点只有左子树,父亲节点指向删除节点的指针指向删除节点的左孩子
3)删除节点只有右子树,父亲节点指向删除节点的指针指向删除节点的右孩子
4)删除节点既有左子树也有右子树,删除节点左子树的最大节点赋值给删除节
点,此时要删除子树的最大节点。
代码实现
int BST_Delete(TreeNode *root, int data)
{
if(NULL == root)
return ERROR;
TreeNode *pos = root,*pre = root;
while(pos){
if(data < pos->data){
pre = pos;
pos = pos->lchild;
}
else if(data > pos->data){
pos = pre;
pos = pos->rchild;
}
else{
if(pos->lchild == NULL && pos->rchild == NULL){
if(pos == pre->lchild) //删除叶子节点
pre->lchild = NULL;
else
pre->rchild = NULL;
free(pos);
return OK;
}
else if(pos->rchild == NULL){
if(pre->lchild == pos) //删除节点只有左子树
pre->lchild = pos->lchild;
else
pre->rchild = pos->lchild;
free(pos);
return OK;
}
else if(pos->lchild == NULL){
if(pre->lchild == pos) //删除节点只有右子树
pre->lchild = pos->rchild;
else
pre->rchild = pos->rchild;
free(pos);
return OK;
}
else{ //删除节点既有左子树,又有右子树
TreeNode *del,*parent;
parent = pos;//记录删除节点的父亲节点
del = pos->lchild;//记录删除节点
while(del->rchild){//找到pos删除节点左子树中最大的节点
parent = del;
del = del->rchild;
}
pos->data = del->data;//pos节点左子树中最大节点赋值给pos节点
if(pos == parent)//pos节点左子数最大节点是子树的根节点
pos->lchild = del->lchild;
else //parent节点的rchild指向del节点的左子树
parent->rchild = del->lchild;
free(del);
return OK;
}
}
}
return ERROR;
}