首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

正在从不使用std::pair的BST中删除节点

从不使用std::pair的BST中删除节点是指在二叉搜索树(Binary Search Tree,BST)中删除一个节点,但不使用C++标准库中的std::pair数据结构。

BST是一种常见的数据结构,它具有以下特点:

  • 每个节点都包含一个键值对,其中键是唯一的。
  • 左子树中的所有节点的键小于根节点的键。
  • 右子树中的所有节点的键大于根节点的键。
  • 左右子树也是BST。

要从BST中删除一个节点,需要考虑以下几种情况:

  1. 要删除的节点是叶子节点(没有子节点):直接删除该节点即可。
  2. 要删除的节点只有一个子节点:将子节点替换为要删除的节点。
  3. 要删除的节点有两个子节点:找到该节点的后继节点(右子树中最小的节点),将后继节点的值复制到要删除的节点中,然后删除后继节点。

以下是一个不使用std::pair的BST删除节点的示例代码:

代码语言:txt
复制
#include <iostream>

// BST节点定义
struct Node {
    int key;
    Node* left;
    Node* right;
};

// 创建新节点
Node* createNode(int key) {
    Node* newNode = new Node();
    newNode->key = key;
    newNode->left = nullptr;
    newNode->right = nullptr;
    return newNode;
}

// 插入节点
Node* insertNode(Node* root, int key) {
    if (root == nullptr) {
        return createNode(key);
    }

    if (key < root->key) {
        root->left = insertNode(root->left, key);
    } else if (key > root->key) {
        root->right = insertNode(root->right, key);
    }

    return root;
}

// 查找节点
Node* searchNode(Node* root, int key) {
    if (root == nullptr || root->key == key) {
        return root;
    }

    if (key < root->key) {
        return searchNode(root->left, key);
    }

    return searchNode(root->right, key);
}

// 查找最小节点
Node* findMinNode(Node* node) {
    Node* current = node;
    while (current && current->left != nullptr) {
        current = current->left;
    }
    return current;
}

// 删除节点
Node* deleteNode(Node* root, int key) {
    if (root == nullptr) {
        return root;
    }

    if (key < root->key) {
        root->left = deleteNode(root->left, key);
    } else if (key > root->key) {
        root->right = deleteNode(root->right, key);
    } else {
        if (root->left == nullptr) {
            Node* temp = root->right;
            delete root;
            return temp;
        } else if (root->right == nullptr) {
            Node* temp = root->left;
            delete root;
            return temp;
        }

        Node* temp = findMinNode(root->right);
        root->key = temp->key;
        root->right = deleteNode(root->right, temp->key);
    }

    return root;
}

// 中序遍历BST
void inorderTraversal(Node* root) {
    if (root != nullptr) {
        inorderTraversal(root->left);
        std::cout << root->key << " ";
        inorderTraversal(root->right);
    }
}

int main() {
    Node* root = nullptr;
    root = insertNode(root, 50);
    root = insertNode(root, 30);
    root = insertNode(root, 20);
    root = insertNode(root, 40);
    root = insertNode(root, 70);
    root = insertNode(root, 60);
    root = insertNode(root, 80);

    std::cout << "BST中序遍历结果:";
    inorderTraversal(root);
    std::cout << std::endl;

    int keyToDelete = 30;
    root = deleteNode(root, keyToDelete);
    std::cout << "删除节点 " << keyToDelete << " 后的BST中序遍历结果:";
    inorderTraversal(root);
    std::cout << std::endl;

    return 0;
}

这段代码实现了一个简单的BST,包括节点的插入、查找、删除和中序遍历功能。删除节点的函数deleteNode使用了递归的方式进行操作。

对于这个问题,腾讯云提供了云计算相关的产品和服务,如云服务器、云数据库、云存储等。具体推荐的产品和产品介绍链接地址可以根据实际需求和使用场景进行选择。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 二分搜索树(Binary Search Tree)

    在实现二分搜索树之前,我们先思考一下,为什么要有树这种数据结构呢?我们通过企业的组织机构、文件存储、数据库索引等这些常见的应用会发现,将数据使用树结构存储后,会出奇的高效,树结构本身是一种天然的组织结构。常见的树结构有:二分搜索树、平衡二叉树(常见的平衡二叉树有AVL和红黑树)、堆、并查集、线段树、Trie等。Trie又叫字典树或前缀树。   树和链表一样,都属于动态数据结构,由于二分搜索树是二叉树的一种,我们先来说说什么是二叉树。二叉树具有唯一的根节点,二叉树每个节点最多有两个孩子节点,二叉树的每个节点最多有一个父亲节点,二叉树具有天然递归结构,每个节点的左子数也是一棵二叉树,每个节点的右子树也是一颗二叉树。二叉树如下图:

    01

    数据结构与算法——2-3树

    前面讲到了二叉搜索树 (BST) 和二叉平衡树 (AVL) ,二叉搜索树在最好的情况下搜索的时间复杂度为 O(logn) ,但如果插入节点时,插入元素序列本身就是有序的,那么BST树就退化成一个线性表了,搜索的时间复杂度为 O(n)。 如果想要减少比较次数,就需要降低树的高度。在插入和删除节点时,要保证插入节点后不能使叶子节点之间的深度之差大于 1,这样就能保证整棵树的深度最小,这就是AVL 树解决 BST 搜索性能降低的策略。但由于每次插入或删除节点后,都可能会破坏 AVL 的平衡,而要动态保证 AVL 的平衡需要很多操作,这些操作会影响整个数据结构的性能,除非是在树的结构变化特别少的情形下,否则 AVL 树平衡带来的搜索性能提升有可能还不足为了平衡树所带来的性能损耗。 因此,引入了 2-3 树来提升效率。2-3 树本质也是一种平衡搜索树,但 2-3 树已经不是一棵二叉树了,因为 2-3 树允许存在 3 这种节点,3- 节点中可以存放两个元素,并且可以有三个子节点。

    01

    算法导论第十二章 二叉搜索树

    二叉搜索树(又名二叉查找树、二叉排序树)是一种可提供良好搜寻效率的树形结构,支持动态集合操作,所谓动态集合操作,就是Search、Maximum、Minimum、Insert、Delete等操作,二叉搜索树可以保证这些操作在对数时间内完成。当然,在最坏情况下,即所有节点形成一种链式树结构,则需要O(n)时间。这就说明,针对这些动态集合操作,二叉搜索树还有改进的空间,即确保最坏情况下所有操作在对数时间内完成。这样的改进结构有AVL(Adelson-Velskii-Landis) tree、RB(红黑)tree和AA-tree。AVL树和红黑树相对应用较多,我们在后面的章节中在做整理。 在二叉搜索树中,任何一个节点的键值一定大于其左子树中的每一个节点的键值,并小于其右子树中每一个节点的键值。我们结合书本的理论对二叉搜索树的动态集合操作做编程实现。其中除了Delete操作稍稍复杂之外,其余的操作都是非常简单的。

    02

    【C++】 哈希

    理想的搜索方法:可以不经过任何比较,一次直接从表中得到要搜索的元素。 如果构造一种存储结构,通过某种函数(hashFunc)使元素的存储位置与它的关键码之间能够建立 一一映射的关系,那么在查找时通过该函数可以很快找到该元素。 当向该结构中: 插入元素 根据待插入元素的关键码,以此函数计算出该元素的存储位置并按此位置进行存放 搜索元素 对元素的关键码进行同样的计算,把求得的函数值当做元素的存储位置,在结构中按此位置 取元素比较,若关键码相等,则搜索成功 该方式即为哈希(散列)方法,哈希方法中使用的转换函数称为哈希(散列)函数,构造出来的结构称 为哈希表(Hash Table)(或者称散列表)

    03
    领券