LeetCode 450. 删除二叉搜索树中的节点 | C++语言版
LeetCode 450. 删除二叉搜索树中的节点
题目描述
题目地址:450. 删除二叉搜索树中的节点
给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。
一般来说,删除节点可分为两个步骤:
首先找到需要删除的节点;
如果找到了,删除它。
解题思路
思路一:使用栈
代码实现
C++
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
TreeNode* deleteNode(TreeNode* root, int key) {
if (root == nullptr) return nullptr;
//如果要删除的节点大于当前节点值,则去右子树中删除
if (key > root->val) root->right = deleteNode(root->right, key); //如果要删除的节点小于当前节点值,则去左子树中删除
else if (key < root->val) root->left = deleteNode(root->left, key); //如果当前节点就是要删除的节点
else
{ // 情况1:要删除节点无左子
if (! root->left) return root->right;
// 情况2:要删除节点无右子
if (! root->right) return root->left;
// 情况3:要删除节点左右子都有(其左子树转移到其右子树的最左节点的左子树上,然后右子树顶替其位置,由此删除了该节点)
TreeNode* node = root->right;
while (node->left)
// 寻找要删除节点右子树的最左节点
node = node->left;
// 将要删除节点的左子树成为其右子树的最左节点的左子树
node->left = root->left;
// 要删除节点的右子顶替其位置,节点被删除
root = root->right;
}
return root;
}
};
运行结果
参考文章:
思路二:减少遍历节点数
代码实现
C++
在这里插入代码片