zoukankan      html  css  js  c++  java
  • 二叉搜索树的C++ 实现

    参考:https://blog.csdn.net/liuchenjane/article/details/53046715
    头文件

    #ifndef DEBUG_LRN_TREENODE_H
    #define DEBUG_LRN_TREENODE_H
    
    
    void echo(int i);
    
    class TreeNode;
    void inorder_tree_walk(TreeNode* x);
    void preorder_tree_walk(TreeNode* x);
    TreeNode* tree_minmum(TreeNode* x);
    TreeNode* tree_maxmum(TreeNode* x);
    TreeNode* tree_search(TreeNode* x, int k);
    TreeNode* tree_successor(TreeNode* x);
    TreeNode* tree_predecessor(TreeNode* x);
    void tree_insert(TreeNode* T, TreeNode* z);
    void transplant(TreeNode* T, TreeNode* u,TreeNode* v);
    void tree_delete(TreeNode* T, TreeNode* z);
    
    
    class TreeNode{
    public:
        int key;
        TreeNode* left;
        TreeNode* right;
        TreeNode* p;
    public:
        TreeNode();
        explicit TreeNode(int val);
        ~TreeNode();
    };
    
    
    #endif //DEBUG_LRN_TREENODE_H
    
    

    源文件

    #include <iostream>
    #include <vector>
    #include "TreeNode.h"
    
    using namespace std;
    
    
    void echo(int i){
        std::cout << i << std::endl;
    }
    
    
    TreeNode::TreeNode()
    {
        key=0;
        left=right=p=nullptr;
    }
    
    TreeNode::TreeNode(int val) {
        key = val;
        left = right = p = nullptr;
    }
    
    TreeNode::~TreeNode() = default;
    
    
    void inorder_tree_walk(TreeNode* x) {
        if (x != nullptr) {
            inorder_tree_walk(x->left);
            cout << x->key << " ";
            inorder_tree_walk(x->right);
        } else
            return;
    }
    
    
    void preorder_tree_walk(TreeNode*x) {
        if (x != nullptr) {
            cout << x->key << " ";
            preorder_tree_walk(x->left);
            preorder_tree_walk(x->right);
        }
    }
    
    
    TreeNode* tree_minmum(TreeNode* x)
    {
        while(x->left != nullptr)
            x = x->left;
        return x;
    }
    TreeNode* tree_maxmum(TreeNode* x)
    {
        while(x->right != nullptr)
            x = x->right;
        return x;
    }
    
    TreeNode* tree_search(TreeNode* x, int k)
    {
        if(x == nullptr || k == x->key)
            return x;
        if(k < x->key)
            return tree_search(x->left, k);
        else return tree_search(x->right, k);
    }
    
    TreeNode* tree_successor(TreeNode* x)//大于x.key的最小关键字的节点为后继
    {
        if(x->right)
            return tree_minmum(x->right);
        TreeNode* y=x->p;
        while(y&& x==y->right)
        {
            x=y;
            y=y->p;
        }
        return y;
    }
    
    
    TreeNode* tree_predecessor(TreeNode* x)//小于x.key的最大关键字的节点为前驱
    {
        if(x->left)
            return tree_maxmum(x->left);
        TreeNode* y=x->p;
        while(y&& x==y->left)
        {
            x=y;
            y=y->p;
        }
        return y;
    }
    
    
    void tree_insert(TreeNode* T, TreeNode* z) //T是现在的BST的树根
    {
        if(T == nullptr){
            T = z;
            return;
        };
        TreeNode* y = nullptr;
        TreeNode* x=T;
    
        while(x != nullptr)
        {
            y = x;
            if(z->key < x->key)
                x = x->left;
            else x = x->right;
        }
        z->p = y;
        if(z->key < y->key)
            y->left = z;
        else y->right = z;
    }
    
    
    //删除节点
    void transplant(TreeNode* T, TreeNode* u,TreeNode* v)//用一颗子树代v替另一个子树u
    {
        if(u->p == nullptr) {
            T = v;
        }
        else if(u == u->p->left) {
            u->p->left = v;
        }
        else{
            u->p->right = v;
        };
        if(v != nullptr){
            v->p = u->p;
        }
    }
    
    
    void tree_delete(TreeNode* T, TreeNode* z) {
        if (!z->left)
            transplant(T, z, z->right);
        else if (!z->right)
            transplant(T, z, z->left);
        else {
            TreeNode *y = tree_minmum(z->right);
            if (y->p != z) {
                transplant(T, y, y->right);
                y->right = z->right;
                y->right->p = y;
            }
            transplant(T, z, y);
            y->left = z->left;
            y->left->p = y;
        }
    }
    

    测试:

    #include <iostream>
    #include <vector>
    #include <string>
    #include <map>
    #include <set>
    #include <algorithm>
    #include "TreeNode.h"
    
    
    using namespace std;
    using namespace cv;
    
    
    void test_bst(){
        auto T = new TreeNode(15);
        vector<int> a = {6, 18, 3, 7, 17, 20, 2, 4, 13, 9};
        for(auto i:a){
            auto z = new TreeNode(i);
            tree_insert(T, z);
        }
        inorder_tree_walk(T);cout<<endl;
        preorder_tree_walk(T);
        TreeNode* min=tree_minmum(T);
        TreeNode* max=tree_maxmum(T);cout<<endl;
        cout<<"最大值:"<<max->key<<"  最小值:"<<min->key<<endl;
        cout<<"查找z=13的节点:";
        TreeNode* z=tree_search(T,13);cout<<z->key<<endl;
        TreeNode* prez=tree_predecessor(z);
        TreeNode* sucz=tree_successor(z);
        cout<<"z的前驱:"<<prez->key<<" "<<"z的后继:"<<sucz->key<<endl;
        tree_delete(T,z);
        cout<<"删除z之后:";
        inorder_tree_walk(T);cout<<endl;
    
    }
    
    
    
    
    int main(int argc, char* argv[])
    {
        test_bst();
        return 0;
    }
    
    
    
  • 相关阅读:
    MySQL(2)---Explain
    MySQL(1)---索引
    php 的 PHPExcel1.8.0 使用教程
    通过html5 的EventSource来进行数据推送
    centos6.6 下 安装 php7 按 nginx方式
    IIS PHP Warning: Unknown: open(c:\php\tmp\sess_xxx, O_RDWR) failed: Permission denied (13) in Unknown on line 0
    动态加载JS,并执行回调函数
    nginx 504 gateway time out
    php 账号不能同时登陆,当其它地方登陆时,当前账号失效
    php 函数中静态变量的问题
  • 原文地址:https://www.cnblogs.com/theodoric008/p/9462935.html
Copyright © 2011-2022 走看看