二叉搜索树删除节点

监控客
• 阅读 53

include <iostream>

// 定义二叉树节点结构
struct TreeNode {

int data;
TreeNode* left;
TreeNode* right;

TreeNode(int val) : data(val), left(nullptr), right(nullptr) {}

};

// 在二叉搜索树中查找要删除的节点
TreeNode findMin(TreeNode node) {

while (node->left != nullptr) {
    node = node->left;
}
return node;

}

// 删除节点
TreeNode deleteNode(TreeNode root, int key) {

if (root == nullptr) return root;

// 在左子树中递归查找要删除的节点
if (key < root->data) {
    root->left = deleteNode(root->left, key);
}
// 在右子树中递归查找要删除的节点
else if (key > root->data) {
    root->right = deleteNode(root->right, key);
}
// 当找到要删除的节点时
else {
    // 节点只有一个子节点或者没有子节点
    if (root->left == nullptr) {
        TreeNode* temp = root->right;
        delete root;
        return temp;
    } else if (root->right == nullptr) {
        TreeNode* temp = root->left;
        delete root;
        return temp;
    }
    
    // 节点有两个子节点
    TreeNode* temp = findMin(root->right);
    root->data = temp->data;
    root->right = deleteNode(root->right, temp->data);
}
return root;

}

// 中序遍历打印二叉树节点值
void inorderTraversal(TreeNode* root) {

if (root == nullptr) return;
inorderTraversal(root->left);
std::cout << root->data << " ";
inorderTraversal(root->right);

}

int main() {

TreeNode* root = nullptr;

// 添加节点
root = insertNode(root, 5);
insertNode(root, 3);
insertNode(root, 7);
insertNode(root, 1);
insertNode(root, 4);
insertNode(root, 6);
insertNode(root, 8);

std::cout << "Binary Tree before deletion: ";
inorderTraversal(root);
std::cout << std::endl;

// 删除节点值为3的节点
root = deleteNode(root, 3);

std::cout << "Binary Tree after deletion: ";
inorderTraversal(root);
std::cout << std::endl;

return 0;

}

点赞
收藏
评论区
推荐文章
白茶清欢 白茶清欢
4年前
js实现二叉树、二叉查找树
树是一种数据结构,该章节讨论二叉树(二叉树的每个节点的子节点不允许超过两个),二叉树中有又分为完全二叉树和不完全二叉树.....不在本章节赘述相关概念,感兴趣可以去查阅《数据结构》。你将会获得:1.如何使用js实现二叉查找树。2.学会前、中、后序遍历。3.了解相关实现原理阅读时长5min,可选择直接调试代码特点    二叉查找树中序遍历后
Stella981 Stella981
4年前
B+树原理以及Java代码实现
最初查找二叉树,由于树的高度会随着有序序列输入而急剧增长,后来出现平衡二叉树,红黑树。B树可以海量数据的快速查询检索,B树主要分为B树(B树),B树,B\树等。B树(B树)M路搜索树,参数M定义节点的分支个数;对于根节点孩子数目为\2,M\,对于其余节点孩子数目为\M/2,M\;每个节点含有关键字属性,至少M/21
Stella981 Stella981
4年前
LeetCode(98): 验证二叉搜索树
Medium!题目描述:给定一个二叉树,判断其是否是一个有效的二叉搜索树。一个二叉搜索树具有如下特征:节点的左子树只包含小于当前节点的数。节点的右子树只包含大于当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。示例 1:输入:2/\
Wesley13 Wesley13
4年前
PHP数据结构与算法:二叉树
一、定义二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”(leftsubtree)和“右子树”(rightsubtree)。二、特性1.在二叉树的第i层上至多有2^(i1)个结点(i0)2.深度为k的二叉树至多有2^k1个结点(k0)3.对于任意一棵二叉树,如果其叶结点数为N0,而
Stella981 Stella981
4年前
LeetCode(110):平衡二叉树
Easy!题目描述:给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树_每个节点_的左右两个子树的高度差的绝对值不超过1。示例1:给定二叉树 3,9,20,null,null,15,73/\920/
Stella981 Stella981
4年前
LeetCode初级算法之树:98 验证二叉搜索树
01题目信息题目地址:https://leetcodecn.com/problems/validatebinarysearchtree/给定一个二叉树,判断其是否是一个有效的二叉搜索树。假设一个二叉搜索树具有如下特征:节点的左子树只包含小于当前节点的数。
Stella981 Stella981
4年前
104. Maximum Depth of Binary Tree
/Definitionforabinarytreenode.publicclassTreeNode{intval;TreeNodeleft;TreeNoderight;TreeNode(intx)
Wesley13 Wesley13
4年前
98. 验证二叉搜索树
题目描述给定一个二叉树,判断其是否是一个有效的二叉搜索树。假设一个二叉搜索树具有如下特征:节点的左子树只包含小于当前节点的数。节点的右子树只包含大于当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。输入:5/\14 /\ 
Wesley13 Wesley13
4年前
JZ18 二叉树镜像
JZ18二叉树镜像题目操作给定的二叉树,将其变换为源二叉树的镜像。思路先遍历,节点入栈,再依次出栈调换左右节点遍历的过程中调换左右节点代码coding:utf8classTreeNode:def__init__
可莉 可莉
4年前
104. Maximum Depth of Binary Tree
/Definitionforabinarytreenode.publicclassTreeNode{intval;TreeNodeleft;TreeNoderight;TreeNode(intx)
贾蔷 贾蔷
8个月前
手搓二叉树构建类代码详解:从入门到实践(适合新手小白)
一、简介和应用二叉树是数据结构中常见的一种树形结构,每个节点最多有两个子节点(左子节点和右子节点)。它广泛应用于算法设计、数据存储与搜索(如二叉搜索树)、表达式解析等领域。本文将通过手写的C代码,讲解如何构建一个基础的二叉树类,帮助新手理解其原理与实现