(模板)删除二叉树上的某个节点
  FnrD2XWlpoQk 2023年11月02日 239 0


### 解题思路

要删除的节点分为三种情况

1.节点既没有左子树也没有右子树:直接删除即可

2.节点只有左子树或者右子树:用子节点替换即可

3.既有左子树又有右子树:找到该节点的后继(比该节点大的最小数),替换后递归删除后继

### 代码

class Solution {
public:
    void delNode(TreeNode* &root,int val){   //加引用可以直接操作节点
        if(!root) return;
        if(root->val == val){  
            if(!root->left && !root->right) root = nullptr;  //没有左子节点和右子节点,直接删除
            else if(!root->left) root = root->right;  //用子树覆盖
            else if(!root->right) root = root->left;  //用子树覆盖
            else{  //找前驱
                TreeNode* p = root->right;
                while(p->left) p = p->left; //找前驱
                root->val = p->val;
                delNode(root->right,p->val);
            }
        }
        else if(root->val < val) delNode(root->right,val);
        else delNode(root->left,val);
    }
    TreeNode* deleteNode(TreeNode* root, int key) {
        delNode(root,key);
        return root;
    }
};

 

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  xjKcUHdcLtgr   2023年11月02日   38   0   0 递归htmlCentOS
  rb2XW0fjLLT8   2023年11月02日   52   0   0 递归斐波那契数迭代
FnrD2XWlpoQk