首页
学习
活动
专区
工具
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.1K20
  • 学好这13种数据结构,应对各种编程语言(C++版)

    << "end a2" << a2[0] << 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.4K10

    二分搜索树实现

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

    76130

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

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

    18120

    二叉搜索树众数是多少?

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

    62260

    【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特点,对于任意一棵BST树均满足根节点数据大于等于左子树任意节点数据域,同时满足根节点数据域小于等于右子树任意节点数据域。...(可以归结到(1)和(2)两种情况当中) 对于一个既有左子树又有右子树节点来讲,在删除节点之后,为了继续维持BST性质,选择一个合适节点作为新树节点是非常有必要。...但是在右子树最小值一定小于右子树其他节点,因此我们可以选取这个最小值所在节点作为新BST根,因为它继续满足BST对于任意节点,其数据大于左子树任意节点数据域但同时小于右子树任意节点数据域性质...=NULL){ root = deleteMin(root); } } //删除BST数据域为value节点,即删除二叉树任意节点 void remove(T value){

    39110

    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 << "q.top()=" <<q.top().first <<<em>std</em>::endl; return 0; } 如果<em>使用</em><em>std</em>

    71320

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

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

    36620

    二、进阶数据结构

    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

    15510

    二叉搜索树

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

    66120

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

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

    54240

    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。

    68510

    【C++进阶】二叉搜索树递归与非递归模拟实现(附源码)

    insertR 既然要递归,那么肯定要用到根节点,同样使用序遍历那样方式,函数里再套一个函数。...erase 删除就有点复杂了,它分几种情况: 首先查找元素是否在二叉搜索树,如果不存在,则返回, 否则要删除结点可能分下面四种情 况: 1.要删除结点无孩子结点   2....return true; } } return false; //没找到返回false } 删除递归实现 eraseR 同样使用函数套函数方式。...当有一个孩子或没有孩子时候,可以直接链接,然后再删除; 当有两个孩子时候,同样使用替换法,找到左子树最大节点(或是右子树最小节点),此时这个最大节点(或是最小节点)一定没有孩子,再递归一次,转换成没有孩子情况..._root); } BSTree& operator=(BSTree bst) //赋值重载 { std::swap(_root, bst.

    13810

    【真题】暑假备战CSP-JS:NOIP2013普及组初赛(第一轮)试题及参考答案电子版(PDF版、无水印可直接打印)

    资料下载 公众号内回复:NOIP2013J,即可获取下载链接,直接打印电子版让孩子做即可,文件包含 试题真题 参考答案 注意:其他比赛年份得资料正在紧张整理,大家耐心等,整理完毕后,会陆续在公众号内分享...将该文件复制到剪切板,并删除原文件 本题共 1.5 分 第 9 题 已知一棵二叉树有10 个节点,则其中至多有( )个节点有 2 个子节点。...A. 1 B. 2 C. 3 D. 4 本题共 1.5 分 第 11 题 二叉树( )第一个访问节点是根节点。 A. 先序遍历 B. 序遍历 C. 后序遍历 D....A0, A3, A1, A2 本题共 1.5 分 第 13 题 IPv4 协议使用32 位地址,随着其不断被分配,地址资源日趋枯竭。因此,它正逐渐被使用( )位地址 IPv6 协议所取代。...之后第 i 行有三个数 value, left_child , right_child ,分别表示该节点关键字值、左子节点编号、右子节点编号;如果不存在左子节点或右子节点,则用 0 代替。

    42620
    领券