二叉排序树

注 关于二叉搜索树更为详细的解释请详看 《大话数据结构》第八章 查找 中二叉搜索树这一小节

二叉排序树(Binary Sort Tree),又称为二叉查找树。它或者是一棵空树,或者是具有下列性质的二叉树:
1,若它的左子树不为空,则左子树上所有节点的值均小于它的根节点的值
2,若它的右子树不为空,则右子树上所有节点的值均大于它的根节点的值
3,它的左,右子树也分别为二叉排序树

  • 二叉树排序树插入操作
    简而言之就是将关键字放到树中的合适位置而已
// 往二叉排序树中插入数据
bitnode* InsertBST(bitnode *b, int m){
    // 如果节点为空,则创建节点并返回
    if(b == NULL){
        b = (bitnode *)malloc(sizeof(bitnode));
        b->data = m;
        b->lchild = NULL;
        b->rchild = NULL;
    }
    else{  
        // 如果插入数值小于节点数值
        if(m < b->data){
            b->lchild = InsertBST(b->lchild, m);
        }  // 如果插入数值大于节点数值
        else if(m>b->data){
            b->rchild = InsertBST(b->rchild, m);
        }
        else{  // 如果插入数值在二叉搜索树中已经存在则不会再次插入
            cout<
  • 二叉排序树创建操作
// 创建二叉排序树
bitnode* CreateBST(){
    int len = 7;
    int number[] = {5, 2, 7, 9, 15, 8, 3};
    bitnode *head = NULL;
    
    for(int i=0; i < len; i++){    //输入树的结点个数
        head = InsertBST(head, number[i]);
    }
    return head;
}
  • 二叉树排序树查找操作
// 在二叉排序树中查找是否有数值为 m 的节点
void searchBST(bitnode *b, int m){
    if(b == NULL){
        cout<<"查找失败"<data){
            searchBST(b->lchild, m);
        }
        else if(m > b->data){
            searchBST(b->rchild, m);
        }
        else{ // m == b->data
            cout<<"查找成功!"<
  • 二叉树排序树删除操作
    删除操作欲删除节点分三种情况
    1, 叶子节点
    2,仅有左或右子树的节点
    3,左右子树都有的节点
// 删除指定节点
bitnode* delteBST(bitnode *b, int m){
    bitnode *q, *s;
    if(b == NULL){
        // 如果 b == NULL 则没查找到数据
        cout<<"没有发现"<data == m){
            if(b->lchild == NULL){ // 左孩子为空,只需要重接右子树
                q = b;
                b = b->rchild;
                free(q);
            }
            else if(b->rchild == NULL){ // 右孩子为空,只需要重接左子树
                q = b;
                b = b->lchild;
                free(q);
            }
            else{ // 左右孩子都不为空
                q = b;
                s = b->lchild;
                while(s->rchild){
                    q = s;
                    s = s->rchild;
                }
                b->data = s->data;
                if(q != b){
                    q->rchild = s->lchild;
                }
                else{
                    q->lchild = s->lchild;
                }
                free(s);
            }
        }
        else if(m < b->data){
            b->lchild = delteBST(b->lchild, m);
        }
        else if(m > b->data){
            b->rchild = delteBST(b->rchild, m);  
        }
    }
    return b;
}
  • 二叉树排序树总结

附完整代码

#include
using namespace std;

typedef struct node{
    int data;             //节点信息
    struct node *lchild;  //左孩子
    struct node *rchild;  //右孩子
}bitnode;

// 往二叉排序树中插入数据
bitnode* InsertBST(bitnode *b, int m){
    // 如果节点为空,则创建节点并返回
    if(b == NULL){
        b = (bitnode *)malloc(sizeof(bitnode));
        b->data = m;
        b->lchild = NULL;
        b->rchild = NULL;
    }
    else{  
        // 如果插入数值小于节点数值
        if(m < b->data){
            b->lchild = InsertBST(b->lchild, m);
        }  // 如果插入数值大于节点数值
        else if(m>b->data){
            b->rchild = InsertBST(b->rchild, m);
        }
        else{  // 如果插入数值在二叉搜索树中已经存在则不会再次插入
            cout<data){
            searchBST(b->lchild, m);
        }
        else if(m > b->data){
            searchBST(b->rchild, m);
        }
        else{ // m == b->data
            cout<<"查找成功!"<lchild);
        printf("%d ",T->data);
        zhongxu(T->rchild); 
    }
}

// 删除指定节点
bitnode* delteBST(bitnode *b, int m){
    bitnode *q, *s;
    if(b == NULL){
        // 如果 b == NULL 则没查找到数据
        cout<<"没有发现"<data == m){
            if(b->lchild == NULL){ // 左孩子为空,只需要重接右子树
                q = b;
                b = b->rchild;
                free(q);
            }
            else if(b->rchild == NULL){ // 右孩子为空,只需要重接左子树
                q = b;
                b = b->lchild;
                free(q);
            }
            else{ // 左右孩子都不为空
                q = b;
                s = b->lchild;
                while(s->rchild){
                    q = s;
                    s = s->rchild;
                }
                b->data = s->data;
                if(q != b){
                    q->rchild = s->lchild;
                }
                else{
                    q->lchild = s->lchild;
                }
                free(s);
            }
        }
        else if(m < b->data){
            b->lchild = delteBST(b->lchild, m);
        }
        else if(m > b->data){
            b->rchild = delteBST(b->rchild, m);  
        }
    }
    return b;
}

int main(){
    bitnode *head=NULL;
    // 验证 CreateBST() 函数
    head = CreateBST();
    cout<<"创建二叉排序树: ";
    zhongxu(head);
    cout<
二叉排序树_第1张图片

你可能感兴趣的:(二叉排序树)