(14)数据结构-二叉排序树

1、介绍

在这里插入图片描述

二叉排序树的中序遍历结果是一个非递减结果。本文介绍二叉排序树的基本实现。

2、数据结构

typedef int ElemType;

typedef struct node{
    
    
    ElemType data;
    node * lchild;
    node * rchild;
}BiNode,*BinTree;

3、函数实现

BinTree InitBinTree(ElemType x);
void Insert(BinTree &T, ElemType x);
void LDR(BinTree T);
void Level(BinTree T);
bool search(BinTree T, ElemType x);
void DeleteElem(BinTree &T, ElemType x);
BinTree FindMax(BinTree T);
BinTree FindMin(BinTree T);

3.1 初始化

BinTree InitBinTree(ElemType x){
    
    
    BinTree T = new BiNode ;
    T->data = x;
    return T;
}

3.2 插入

将插入的元素与跟节点root的data对比确定插入的是左子树还是右子树,一次类推。

void Insert(BinTree &T, ElemType x){
    
    
    if(T == NULL){
    
    
        T = new BiNode;
        T->data = x;
    }else{
    
    
        if(x < T->data){
    
    
            Insert(T->lchild,x);
        }else if(x > T->data){
    
    
            Insert(T->rchild,x);
        }else{
    
    
            return;
        }
    }
}

3.3 中序遍历

void LDR(BinTree T){
    
    
    if(T){
    
    
        LDR(T->lchild);
        cout << T->data << " ";
        LDR(T->rchild);
    }
}

3.4 层序遍历

void Level(BinTree T){
    
    
    queue<BinTree> q;
    q.push(T);
    if(T==NULL){
    
    
        return;
    }else{
    
    
        while(!q.empty()){
    
    
            BinTree temp = q.front();
            q.pop();
            cout << temp->data << " ";
            if(temp->lchild){
    
    
                q.push(temp->lchild);
            }

            if(temp->rchild){
    
    
                q.push(temp->rchild);
            }
        }
    }
}

3.5 查找

查找也相对简单,因为二叉排序树 左子树 < 根节点< 右子树

bool search(BinTree T, ElemType x){
    
    
    if(T == NULL){
    
    
        cout <<"Fail" << endl;
        return false;
    }
    if (T->data == x){
    
    
        cout << "succsssfully";
        return true;
    }else if (x < T->data){
    
    
        search(T->lchild,x);
    }else{
    
    
        search(T->rchild,x);
    }

}

3.6 删除

  • 如果当前root节点为空,直接返回。
  • 如果当前节点的data正好等于x,则进入删除处理
    –如果为当前节点没有左右子树,直接让当前节点为null
    –如果当前节点存在左子树,让左子树中的最大节点的data覆盖当前节点的data
    –如果当前节点存在右子树,让右子树的最小节点的data覆盖当前节点data
    -如果当前节点data小于x,则进入右子树。
    -如果当前节点大于x,则进入左子树。
void DeleteElem(BinTree &T, ElemType x){
    
    
    if(T == NULL){
    
    
        return ;
    }else{
    
    
        if(x == T->data){
    
    
            if(!T->lchild && !T->rchild){
    
    
                T = NULL;
            }else if (T->lchild){
    
    
                BinTree pre = FindMax(T->lchild);
                T->data = pre->data;
                DeleteElem(T->rchild,pre->data);
            }else if (T->rchild){
    
    
                BinTree next = FindMin(T->rchild);
                T->data = next->data;
                DeleteElem(T->lchild,next->data);
            }
        }else if (x < T->data){
    
    
            DeleteElem(T->lchild,x);
        }else if (x > T->data){
    
    
            DeleteElem(T->rchild,x);
        }
    }
}

3.7 查找T的最大节点

一直往右子树找

BinTree FindMax(BinTree T){
    
    
    BinTree temp = T;
    while(temp->rchild){
    
    
        temp = temp->rchild;
    }
    return temp;
}

3.8 查找T的最小节点
一直往左子树找

BinTree FindMin(BinTree T){
    
    
    BinTree  temp = T;
    while(temp->lchild){
    
    
        temp = temp->lchild;
    }
    return temp;
}

4、 完整代码

#include<iostream>
#include<queue>

using namespace std;

typedef int ElemType;

typedef struct node{
    
    
    ElemType data;
    node * lchild;
    node * rchild;
}BiNode,*BinTree;

BinTree InitBinTree(ElemType x);
void Insert(BinTree &T, ElemType x);
void LDR(BinTree T);
void Level(BinTree T);
bool search(BinTree T, ElemType x);
void DeleteElem(BinTree &T, ElemType x);
BinTree FindMax(BinTree T);
BinTree FindMin(BinTree T);

int main(){
    
    

    BinTree T = InitBinTree(5);
    for(int i = 0; i < 10; i++){
    
    
        int t = random()%10;
        Insert(T,t);
    }

    LDR(T);
    cout << endl;
    Level(T);
    cout << endl;

    cout << "I wonder whether 3 is exists" << endl;
    search(T,3);

    cout << "I want to delete the root node" << endl;
    DeleteElem(T,5);
    cout << "After Deleting" << endl;
    LDR(T);
    cout << endl;
    Level(T);
    cout << endl;



    return 0;
}

BinTree InitBinTree(ElemType x){
    
    
    BinTree T = new BiNode ;
    T->data = x;
    return T;
}

void LDR(BinTree T){
    
    
    if(T){
    
    
        LDR(T->lchild);
        cout << T->data << " ";
        LDR(T->rchild);
    }
}

void Insert(BinTree &T, ElemType x){
    
    
    if(T == NULL){
    
    
        T = new BiNode;
        T->data = x;
    }else{
    
    
        if(x < T->data){
    
    
            Insert(T->lchild,x);
        }else if(x > T->data){
    
    
            Insert(T->rchild,x);
        }else{
    
    
            return;
        }
    }
}

void Level(BinTree T){
    
    
    queue<BinTree> q;
    q.push(T);
    if(T==NULL){
    
    
        return;
    }else{
    
    
        while(!q.empty()){
    
    
            BinTree temp = q.front();
            q.pop();
            cout << temp->data << " ";
            if(temp->lchild){
    
    
                q.push(temp->lchild);
            }

            if(temp->rchild){
    
    
                q.push(temp->rchild);
            }
        }
    }
}

bool search(BinTree T, ElemType x){
    
    
    if(T == NULL){
    
    
        cout <<"Fail" << endl;
        return false;
    }
    if (T->data == x){
    
    
        cout << "succsssfully";
        return true;
    }else if (x < T->data){
    
    
        search(T->lchild,x);
    }else{
    
    
        search(T->rchild,x);
    }

}

void DeleteElem(BinTree &T, ElemType x){
    
    
    if(T == NULL){
    
    
        return ;
    }else{
    
    
        if(x == T->data){
    
    
            if(!T->lchild && !T->rchild){
    
    
                T = NULL;
            }else if (T->lchild){
    
    
                BinTree pre = FindMax(T->lchild);
                T->data = pre->data;
                DeleteElem(T->rchild,pre->data);
            }else if (T->rchild){
    
    
                BinTree next = FindMin(T->rchild);
                T->data = next->data;
                DeleteElem(T->lchild,next->data);
            }
        }else if (x < T->data){
    
    
            DeleteElem(T->lchild,x);
        }else if (x > T->data){
    
    
            DeleteElem(T->rchild,x);
        }
    }
}


BinTree FindMax(BinTree T){
    
    
    BinTree temp = T;
    while(temp->rchild){
    
    
        temp = temp->rchild;
    }
    return temp;
}

BinTree FindMin(BinTree T){
    
    
    BinTree  temp = T;
    while(temp->lchild){
    
    
        temp = temp->lchild;
    }
    return temp;
}

Guess you like

Origin blog.csdn.net/xdg15294969271/article/details/120494731