首页
学习
活动
专区
工具
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使用了递归的方式进行操作。

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

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

相关·内容

LeetCode 450: 删除二叉搜索树中的节点 Delete Node in a BST

题目: 给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。...Given a root node reference of a BST and a key, delete the node with the given key in the BST....5 / \ 2 6 \ \ 4 7 解题思路: 待删除节点在二叉树中的三种情况有: 如果目标节点没有子节点,我们可以直接移除该目标节点。...另外二叉搜索树的中序遍历结果为从小到大顺序排列的; 删除节点如果不是叶子节点时, 则应把该节点的值替换为其右子树中最小的一个节点值 (删除节点的后驱节点); 删除节点如果不是叶子节点且无右子树时, 则应把该节点的值替换为其左子树中最大的一个节点值...(删除节点的前驱节点), 并在子树中递归删除刚刚替换的节点 你会发现, 二叉搜索树最小节点为该树的最左叶子; 最大节点为该树的最右叶子, 即: 如果 key > root.val,说明要删除的节点在右子树

1.2K20
  • 学好这13种数据结构,应对各种编程语言(C++版)

    std::endl; // 比较两个数组中的元素是否都相等 if (a == a2) {}} 可变数组,向量vector 在C++中使用 Vector...(); // 删除末尾元素 v2.pop_back(); // 在末尾插入元素 v2.insert(v2.end(), 3);} 双向链表 list 双向链表具有指向前一个节点和后一个节点的指针...C++ 中的底层使用「堆」实现的,这样时间复杂度可以控制在 O(logn)。...q.pop(); } // 队列是否为空 q.empty();} 堆heap 堆是一颗完全二叉树,某个节点的值总是不大于父节点的值(大根堆),可以使用数组来表示一个堆,C++ 默认提供的是大根堆...使用 BST 实现 Set。在 C++ 中 set 是有序的,同时也提供了无序的 set 「UnorderSet」。

    1.5K10

    二分搜索树实现

    二分搜索树实现 0.导语 目标:手写一个二分搜索树,完成二分搜索树的插入,删除,修改,查询,遍历等操作。 1.类封装与节点定义 ★节点定义 ” 对于BST,我们定义节点包含指向左子树与指向右子树。...2.2.1 递归插入 ★思路 ” 递归插入后返回BST的根节点。首先明确递归终止条件:当节点为空,此时插入我们需要动态分配内存,new一个节点,并对BST树的节点个数+1。...,通过父亲来连接新插入的节点,这样就形成了一颗BST树。...★删除最小节点 ” 不断递归左孩子,直到当前节点的左孩子为空,那么这个节点就是最左节点,此时需要做三个动作: 保存当前节点的右孩子。 删除当前节点 返回右孩子。...private: /** * 在node为根的二叉搜索树中,寻找key的祖先中,比key大的最小值所在节点.递归算法 * 算法调用前已保证key存在在以node为根的二叉树中

    76830

    使用 Go 语言实现二叉搜索树

    原文链接: 使用 Go 语言实现二叉搜索树二叉树是一种常见并且非常重要的数据结构,在很多项目中都能看到二叉树的身影。...它有很多变种,比如红黑树,常被用作 std::map 和 std::set 的底层实现;B 树和 B+ 树,广泛应用于数据库系统中。...二叉搜索树的特点最重要的就是它的有序性,在二叉搜索树中,每个节点的值都大于其左子树中的所有节点的值,并且小于其右子树中的所有节点的值。图片这意味着通过二叉搜索树可以快速实现对数据的查找和插入。...,分三种情况来考虑:如果要删除的节点没有子节点,只需要直接将父节点中,指向要删除的节点指针置为 nil 即可如果删除的节点只有一个子节点,只需要更新父节点中,指向要删除节点的指针,让它指向删除节点的子节点即可如果删除的节点有两个子节点...,我们需要找到这个节点右子树中的最小节点,把它替换到要删除的节点上。

    19520

    【Groovy】Xml 反序列化 ( 使用 XmlParser 解析 Xml 文件 | 删除 Xml 文件中的节点 | 增加 Xml 文件中的节点 | 将修改后的 Xml 数据输出到文件中 )

    文章目录 一、删除 Xml 文件中的节点 二、增加 Xml 文件中的节点 三、将修改后的 Xml 数据输出到文件中 四、完整代码示例 一、删除 Xml 文件中的节点 ---- 在 【Groovy】Xml...反序列化 ( 使用 XmlParser 解析 Xml 文件 | 获取 Xml 文件中的节点和属性 | 获取 Xml 文件中的节点属性 ) 博客基础上 , 删除 Xml 文件中的节点信息 ; 下面是要解析的..., 删除子节点 , 需要通过父节点进行删除 , 调用 xmlParser 对象 ( 根节点 ) 的 remove 方法 , 删除二级节点 age 节点 ; // 获取 age 节点 Node ageNode...= xmlParser.age[0] // 从根节点中删除 age 节点 xmlParser.remove(ageNode) 二、增加 Xml 文件中的节点 ---- 增加 Xml 文件中的节点 ,...调用 appendNode 方法 , 可以向节点插入一个子节点 ; // 添加节点 xmlParser.appendNode("height", "175cm") 三、将修改后的 Xml 数据输出到文件中

    6.2K40

    二叉搜索树中的众数是多少?

    (BST),找出 BST 中的所有众数(出现频率最高的元素)。...假定 BST 有如下定义: 结点左子树中所含结点的值小于等于当前结点的值 结点右子树中所含结点的值大于等于当前结点的值 左子树和右子树都是二叉搜索树 例如: 给定 BST [1,null,2,2],...(即map中的value)排个序 有的同学可能可以想直接对map中的value排序,还真做不到,C++中如果使用std::map或者std::multimap可以对key排序,但不能对value排序。...); // 给频率排个序 取前面高频的元素 此时数组vector中已经是存放着按照频率排好序的pair,那么把前面高频的元素取出来就可以了。...这就考察对树的操作了。 在二叉树:搜索树的最小绝对差中我们就使用了pre指针和cur指针的技巧,这次又用上了。 弄一个指针指向前一个节点,这样每次cur(当前节点)才能和pre(前一个节点)作比较。

    63860

    移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——12.二叉搜索树

    1.二叉搜索树 1.1二叉搜索树概念 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树: 1.若它的左子树不为空,则左子树上所有节点的值都小于根节点的值 2.若它的右子树不为空...**二叉搜索树的删除    首先查找元素是否在二叉搜索树中,如果不存在,则返回, 否则要删除的结点可能分下面四种情 况: a. 要删除的结点无孩子结点 b. 要删除的结点只有左孩子结点 c....要删除的结点有左、右孩子结点  看起来有待删除节点有4中情况,实际情况a可以与情况b或者c合并起来,因此真正的删除过程 如下: 情况b:删除该结点且使被删除节点的双亲结点指向被删除节点的左孩子结点...--直接删除 情况c:删除该结点且使被删除节点的双亲结点指向被删除结点的右孩子结点--直接删除 情况d:在它的右子树中寻找中序下的第一个结点(关键码最小),用它的值填补到被删除节点 中,再来处理该结点的删除问题...right; } std:swap(root->data, it->data); return _erase(root->left, x); //从原应当删除的位置的左子树开始删除

    7310

    BST(二叉搜索排序树)类模板的实现

    重点条件:左子树中的所有节点的数据域都小于或等于根节点的数据域,而右子树中的所有节点的数据域都大于等于根节点的数据域。根据这个特点,BST树的中序遍历是一个由小到大的顺序序列。...BST树删除任意节点操作相对较难,这里分析一下。由于BST树的特点,对于任意一棵BST树均满足根节点的数据大于等于左子树任意节点的数据域,同时满足根节点的数据域小于等于右子树任意节点的数据域。...(可以归结到(1)和(2)两种情况当中) 对于一个既有左子树又有右子树的节点来讲,在删除该节点之后,为了继续维持BST树的性质,选择一个合适的节点作为新树的根节点是非常有必要的。...但是在右子树中的最小值一定小于右子树其他节点,因此我们可以选取这个最小值所在的节点作为新BST的根,因为它继续满足BST对于任意节点,其数据大于左子树任意节点的数据域但同时小于右子树中任意节点的数据域的性质...=NULL){ root = deleteMin(root); } } //删除BST树中数据域为value的节点,即删除二叉树中的任意节点 void remove(T value){

    40110

    c++优先级队列priority_queue使用lambda表达式出错问题

    优先级队列简介 优先级队列priority_queue,可以在队列中自定义数据的优先级, 让优先级高的排在队列前面优先出队。...)  //判断一个队列是否为空 pop( )  //删除队顶元素 push( )  //加入一个元素 size( )  //返回优先队列中拥有的元素个数 top( )  //返回优先队列的队顶元素 优先队列的时间复杂度为...2 小顶堆图示: 小顶堆的建立和删除都是 下沉 操作,添加做的是 上浮 操作。...可能你使用了c++20的特性,在c++20之前不支持。 在 C++20 之前闭包类型不是默认可构造的。在 C++20 中没有捕获的闭包类型是默认可构造的。...make_pair("zhen",1)); std::cout std::endl; return 0; } 如果使用std

    75620

    实现二分查找树,支持插入、删除、查询操作。

    二分查找树中每个节点都具有以下性质: 节点的左子树只包含小于当前节点的数。 节点的右子树只包含大于当前节点的数。 所有左子树和右子树自身也必须是二叉搜索树。...在实现二分查找树的过程中,我们可以使用C++中的类来表示节点和树。具体而言,每个节点应包含如下属性: 当前节点的值 val; 当前节点的左子树 left; 当前节点的右子树 right。...在C++实现中还需要提供以下操作: 插入元素 insert; 删除元素 remove; 查询元素 find。 底层数据结构可以使用链表或数组均可。...具体而言,代码实现插入、删除和查找三个基本操作。 需要注意的是,在删除节点时,由于需要从源码中任意位置删除一个节点,因此需要考虑多种情况,例如节点只有一个儿子、节点没有儿子等情况。...为了解决这些问题,我们可以采用递归方式依次寻找右子树的最小值,并将其作为新的根节点。(当然也可以使用其他搜索方法,比如迭代)。

    5810

    数据结构小记【PythonC++版】——BST树篇

    ~来个复杂点的热热身~ 该BST树的中序遍历结果:7 15 17 22 27 30 45 60 75 注意,BST树的结构不是一次性立即生成的,而是基于查找过程逐渐生成的。...在查找过程中,当树中的节点元素不等于被查找值时,才进行插入节点的操作。 使用二叉查找树的好处 如果BST树是一棵平衡二叉树,那么在BST树上进行插入和删除操作的速度会很快。...使用二叉查找树的缺点 BST树的最终形状依赖于插入操作的顺序,导致BST树可以退化成单链表(如果单调递减式的插入元素),后面会讲到AVL树,可以规避此缺点。...插入节点: 1.先执行查找操作,来确定新节点的位置。 2.确认位置后,插入新节点,新节点成为叶子节点。 删除节点: 从BST树删除节点时,我们关心的是保持树的其余节点以正确的顺序排列。...三,BST树的代码实现 代码样例中的BST树采用的是链式存储实现,代码中节点的初始化和一般的二叉树代码类似,由数据域、左指针、右指针构成。

    39420

    二、进阶数据结构

    515 每棵树行中找最大值class Solution { // 定义:删除 BST 中小于 low 和大于 high 的所有节点,返回结果 BST public TreeNode trimBST...无论使用哪种思维模式,你都需要思考:如果单独抽出一个二叉树节点,它需要做什么事情?需要在什么时候(前/中/后序位置)做?其他的节点不用你操心,递归函数会帮你在所有节点上执行相同的操作。...[n]; //要排序的数组 Pair[] arr = new Pair[n]; // 记录元素原始的索引位置,以便在 count 数组中更新结果...(Easy)701.二叉搜索树中的插入操作(Medium)删除二叉搜索树中的节点(Medium)BST遍历框架无需遍历所有子树!!!...删除二叉搜索树中的节点(Medium)class Solution { //找到新的节点并返回 public TreeNode deleteNode(TreeNode root, int

    16210

    二叉搜索树

    算法如下: 1)树空时,直接返回NULL 2)树非空时,如果要删除的是叶子节点时,直接删除,并把父节点的相应指针置为NULL。...3)要删除的只有一个孩子时,把其父节点的指针指向要删除的结点的孩子结点。...4)要删除的有两个孩子结点时,用另一个结点代替被删除的结点:右子树的最小结点或者左子树的最大结点 下面是3种情况图示: 算法如下: //删除操作 BinarySearchTree.../data大于根节点时,到右子树去删除data BST->rchild = this->Delete(BST->rchild,data); }else{//data等于根节点时...} } return BST; } ---- 删除最小值 算法如下: 1)如果树为空,则返回NULL 2)当树不为空时,直至搜索左子树直至当前结点左子树为空,同时保存当前结点的父节点

    67020

    数据结构栈队列链表树二叉查找树

    删除栈顶的时候,可以top下移,更好的一种方法就是调用T的析构函数把所占的内存释放掉。 还有一个东西,和堆栈无关,是使用VS的时候可能会遇到的一个问题,以前遇到过,这次又遇到了。...在使用std::copy()的时候遇到的编译错误: 错误 C4996 'std::copy::_Unchecked_iterators::_Deprecate': Call to 'std::copy...四种遍历方法:前序,后序,中序,层遍历,前三种是根据节点来说的,节点在前称作前序遍历,在后称作后序遍历,其他以此类推,层遍历即一层一层地遍历。...写起来也比较简单:直接利用的STL的队列来做,很好用。 //层序遍历使用队列来做,先进先出。...:" 节点的位置,在二叉树中的位置 std::cout << "\tdata:" << data.key << endl; if (leftChild)

    54840

    CMU 15445 2023fall #Project0 实现一个简单的k-v存储引擎

    在写时复制trie中,操作不直接修改原始trie的节点。而是为修改后的数据创建新的节点,并为新修改的trie返回新的根。在root中插入 ("ad", 2) 。...注意,值的类型可能是不可复制的(即, std::unique_ptr 因此需要使用移动语义)。这个方法返回一个新的trie,也就是说,实现写时拷贝。...然后发现a的子节点无d这条路径。那么新建一个节点,然后恢复调用栈的过程中建立新的指向关系。 这里要注意智能指针和移动语义的运用。...,如果有子节点则不能删除,只能将key节点转为无value的普通节点,然后返回true表示删除了一个键值。...获取递归的结果,如果为false,则说明没有删除任何节点,直接返回false,否则判断当前节点是否可删除(是否为value节点 or 是否有子节点),如果可删除则删除当前节点并返回true。

    85210
    领券