This commit is contained in:
youngyangyang04
2020-08-14 09:56:25 +08:00
parent 304e409f48
commit a54a31a5a9
5 changed files with 70 additions and 43 deletions

View File

@@ -5,9 +5,12 @@ https://leetcode-cn.com/problems/delete-node-in-a-bst/
平衡二叉树中删除节点有三种情况
1. 找到删除的节点,其左节点为空,那么就返回其右节点
2. 找到删除的节点,其右节点为空,那么就返回其左节点
3. 找到删除的节点,左右孩子节点都不为空,则将左孩子放到右孩子的最左面的节点的左孩子上。
* 找到删除的节点,遍历到空节点直接返回了
* 找到删除的节点
* 左右孩子都为空(叶子节点),直接删除节点, 返回NULL为根节点
* 其左孩子为空,右孩子不为空,删除节点,右孩子补位 ,返回右孩子为根节点
* 其右孩子为空,左孩子不为空,删除节点,左孩子补位,返回左孩子为根节点
* 左右孩子节点都不为空,则将删除节点的左孩子放到删除节点的右孩子的最左面节点的左孩子上,返回删除节点右孩子为新的根节点。
## C++代码
@@ -18,9 +21,14 @@ public:
TreeNode* deleteNode(TreeNode* root, int key) {
if (root == NULL) return root;
if (root->val == key) {
if (root->left == NULL) return root->right; // 第一种情况
else if (root->right == NULL) return root->left; // 第二种情况
else { // 第三种情况
// 第一种情况:左右孩子都为空(叶子节点),直接删除节点, 返回NULL为根节点
// 第二种情况:其左孩子为空,右孩子不为空,删除节点,右孩子补位 ,返回右孩子为根节点
if (root->left == NULL) return root->right;
// 第三种情况:其右孩子为空,左孩子不为空,删除节点,左孩子补位,返回左孩子为根节点
else if (root->right == NULL) return root->left;
// 第四种情况:左右孩子节点都不为空,则将删除节点的左孩子放到删除节点的右孩子的最左面节点的左孩子的位置
// 返回删除节点右孩子为新的根节点。
else {
TreeNode* cur = root->right;
while(cur->left != NULL) {
cur = cur->left;