算法思想

450. 删除二叉搜索树中的节点

根据二叉搜索树的性质

  • 如果目标节点大于当前节点值,则去右子树中删除;
  • 如果目标节点小于当前节点值,则去左子树中删除;
  • 如果目标节点就是当前节点,分为以下三种情况:
  • 其无左子:其右子顶替其位置,删除了该节点;
  • 其无右子:其左子顶替其位置,删除了该节点;
  • 其左右子节点都有:其左子树转移到其右子树的最左节点的左子树上,然后右子树顶替其位置,由此删除了该节点。 第三种情况图示如下:

链接:https://leetcode-cn.com/problems/delete-node-in-a-bst/solution/miao-dong-jiu-wan-shi-liao-by-terry2020-tc0o/

LeetCode搜索二叉树的练习_删除节点

参考代码:

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 // 当前节点就是要删除的节点
{
if (! root->left) return root->right; // 情况1,欲删除节点无左子
if (! root->right) return root->left; // 情况2,欲删除节点无右子
TreeNode* node = root->right; // 情况3,欲删除节点左右子都有
while (node->left) // 寻找欲删除节点右子树的最左节点
node = node->left;
node->left = root->left; // 将欲删除节点的左子树成为其右子树的最左节点的左子树
root = root->right; // 欲删除节点的右子顶替其位置,节点被删除
}
return root;
}
};

作者:Terry2020
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

669. 修剪二叉搜索树

LeetCode搜索二叉树的练习_二叉搜索树_02

class Solution {
public:
TreeNode* trimBST(TreeNode* root, int low, int high) {
if(root == nullptr) return root;
if(root->val <low) return root->left = trimBST(root->right, low, high);
if(root->val > high) return root->right = trimBST(root->left, low ,high);
root->left = trimBST(root->left, low, high);
root->right = trimBST(root->right, low, high);
return root;
}
};

538. 把二叉搜索树转换为累加树

LeetCode搜索二叉树的练习_二叉搜索树_03

LeetCode搜索二叉树的练习_删除节点_04

class Solution {
public:
int pre;
void convertBSTCore(TreeNode* cur){
if(cur == nullptr) return ;
// 中序遍历 但是是右中左
if(cur->right) convertBSTCore(cur->right);
cur->val +=pre;
pre = cur->val;
if(cur->left) convertBSTCore(cur->left);
return;
}
TreeNode* convertBST(TreeNode* root) {
pre = 0;
convertBSTCore(root);
return root;
}
};