• 二叉搜索树基本操作实现


    二叉搜索树又称为二叉排序树,首先二叉搜索树是一棵二叉树,所谓二叉树,就是"任意节点最多允许两个子节点",这两个子节点称为左右子节点。

     二叉搜索树的性质:
    1、若左子树不空,则左子树上的所有节点的值均小于其根节点的值;
    2、若右子树不空,则右子树上的所有节点的值均大于其根节点的值;
    上图便是一个二叉搜索树,也就是说:任意节点的键值一定大于其左子树中的每一个节点的键值,并小于其右子树中的每一个节点的键值。
    下面是自己对二叉搜索树的代码实现:
    #include <iostream>
    
    using namespace std;
    
    struct TreeNode {
        int val;
        TreeNode* left;
        TreeNode* right;
        TreeNode(int x) : val(x), left(NULL), right(NULL) {};
    };
    
    TreeNode* searchBST(TreeNode* root, int key) {
        while (root != NULL) {
            if (key == root->val)
                return root;
            root = root->val > key ? root->left : root->right;
        }
        return NULL;
    }
    
    void insertBST(TreeNode* &root, int data) {
        TreeNode* node = new TreeNode(data);
        if (root == NULL) {
            root = node;
            return;
        }
    
        if (searchBST(root, data) != NULL)
            return;
        TreeNode* preNode = NULL;
        TreeNode* curNode = root;
        while (curNode) {
            preNode = curNode;
            curNode = curNode->val > data ? curNode->left : curNode->right;
        }
        if (preNode->val > data)
            preNode->left = node;
        else
            preNode->right = node;
    }
    
    void minOrderVisit(TreeNode* root) {
        if (root == NULL)
            return;
        minOrderVisit(root->left);
        cout << root->val << " ";
        minOrderVisit(root->right);
    }
    
    void deleteBST(TreeNode* &root, int data) {
    
        if (root == NULL)
            return;
    
        if (root->val == data) {
            TreeNode* p = root;
            if (root->left == NULL && root->right == NULL) {
                root = NULL;
            }else if (root->left == NULL)
                root = root->right;
            else if (root->right == NULL)
                root = root->left;
            else {
                TreeNode* temp = root->right;
                TreeNode* find = NULL;
                while (temp) {
                    find = temp;
                    temp = temp->left;
                }
                find->left = root->left;
                root = root->right;
            }
            delete p;
        } else if (root->val > data)
            deleteBST(root->left, data);
        else
            deleteBST(root->right, data);
    }
    
    int main() {
    
        int a[] = { 2, 1, 4, 3, 5, 6, 8, 7, 9, 10 };
        int len = sizeof(a) / sizeof(a[0]);
        TreeNode* p = NULL;
        for (int i = 0; i < len; i++) {
            insertBST(p, a[i]);
        }
        deleteBST(p, 7);
        minOrderVisit(p);
        system("pause");
        return 0;
     }
  • 相关阅读:
    [ZJOJ] 5772【NOIP2008模拟】今天你AK了吗
    exgcd扩展欧几里得求解的个数
    Dinic当前弧优化 模板及教程
    [Luogu] P3907 圈的异或
    提升——树形DP
    C++ 优先队列
    C++ 洛谷 P2458 [SDOI2006]保安站岗 from_树形DP
    C++ 洛谷 2014 选课 from_树形DP
    C++ luogu1352没有上司的舞会 from_树形DP
    浅说——树形DP
  • 原文地址:https://www.cnblogs.com/evenleee/p/8474505.html
Copyright © 2020-2023  润新知