美文网首页
二叉搜索树

二叉搜索树

作者: 科学旅行者 | 来源:发表于2016-07-23 10:22 被阅读8次

    二叉树:

    树中所有节点的儿子个数都不超过2.

    二叉搜索树特点:

    所有的节点,都满足左子树上的所有节点都比自己的小,而右子树上的所有节点都比自己大。

    二叉搜索树的基本操作:

    定义结构体变量:

    #include <iostream>
    using namespace std;
    struct node {
        int val;//节点的值;
        node *lch;//左节点;
        node *rch;//右节点;
    };
    

    二叉搜索树的建立:

    node *creat(node *p,int num) {//先判断值是否存在,再创建节点;
        if (p == nullptr) {
            node *q = new node;
            q -> val = num;
            q -> lch = q -> rch = nullptr;
            return q;
        }
        else {
            if (num < p -> val) {//建立左子树:
                p -> lch = creat(p -> lch,num);
            }
            else {//建立右子树;
                p -> rch = creat(p -> rch,num);
            }
            return p;
        }
    }
    

    先序遍历:先根再左再右。

    void provisit(node *p) {
        if (p) {
            cout << p -> val << " ";
            provisit(p -> lch);
            provisit(p -> rch);
        }
    }
    

    中序遍历:先左再根再右。

    void midvisit(node *p) {
        if (p) {
            midvisit(p -> lch);
            cout << p -> val << " ";
            midvisit(p -> rch);
        }
    }
    

    后序遍历:先左再右再根。

    void nextvisit(node *p) {
        if (p) {
            nextvisit(p -> lch);
            nextvisit(p -> rch);
            cout << p -> val << " ";
        }
    }
    

    查询某值:

    bool find(node *p,int num) {
        if (p == nullptr) return false;//表明在当前子树中未找到此值;
        else if (p -> val == num) return true;//找到了;
        else if (num < p -> val) return find(p -> lch,num);//值比当前根的值小;
        else return find(p -> rch,num);//值比当前根的值大;  
    }
    

    删除某值:
    需要删除的节点没有左儿子,那么就把右儿子提上去。
    需要删除的节点的左儿子没有右儿子,那么就把左儿子提上去。
    以上两种情况都不满足的话,就把左儿子的子孙中最大的节点提到需要删除的节点上。

    node *remove(node *p,int num) {
        if (p == nullptr) return nullptr;
        else if (num < p -> val) p -> lch = remove(p -> lch,num);
        else if (num > p -> val) p -> rch = remove(p -> rch,num);
        else if (p -> lch == nullptr) {
            node *q = p -> rch;
            delete p;
            return q;
        }   
        else if (p -> lch -> rch == nullptr) {
            node *q = p -> lch;
            q -> rch = p -> rch;
            delete p;
            return q;
        }
        else {
            node *q;
            for (q = p -> lch;q -> rch -> rch != nullptr;q = q -> rch);
            node *r = q -> rch;
            q -> rch = r -> lch;
            r -> lch = p -> lch;
            r -> rch = p -> rch;
            delete p;
            return r;
        }
        return p;
    }//注意节点的连接;
    

    测试:

    int main() {
        int num;
        int t = 10;
        node *root = nullptr;
        while (t--) {
            cin >> num;
            root = creat(root,num);
        }
        provisit(root);
        cout << endl;
        midvisit(root);
        cout << endl;
        nextvisit(root);
        cout << endl;
        int num1;
        cout << "find ?????: ";
        cin >> num1;
        if (find(root,num1)) cout << "find it" << endl;
        else cout << "not find it" << endl;
        cin >> num1;
        root = remove(root,num1);
        provisit(root);
        return 0;
    }
    

    如果有什么问题,欢迎批评指正。

    相关文章

      网友评论

          本文标题:二叉搜索树

          本文链接:https://www.haomeiwen.com/subject/kffwjttx.html