LeetCode:删除二叉搜索树中的节点

题目

给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。

一般来说,删除节点可分为两个步骤:

首先找到需要删除的节点;
如果找到了,删除它。
说明: 要求算法时间复杂度为 O(h),h 为树的高度。

示例:

root = [5,3,6,2,4,null,7]
key = 3

    5
   / \
  3   6
 / \   \
2   4   7

给定需要删除的节点值是 3,所以我们首先找到 3 这个节点,然后删除它。

一个正确的答案是 [5,4,6,2,null,null,7], 如下图所示。

    5
   / \
  4   6
 /     \
2       7

另一个正确答案是 [5,2,6,null,4,null,7]。

  5
 / \
2   6
 \   \
  4   7

解题思路

主要是使用前序遍历,先对节点进行比较,如果key>currentNode,那么在右子树中,查找右子树,反之右子树。如果和key相同,根据节点的情况,进行删除,主要分为2种情况:
1.key 节点有左子树或者右子树,那么把左子树或者右子树,变为节点;
2.如果都存在,那么找到右子树的最左子节点,作为新节点,然后把节点的左右子树,分别赋值给新节点。

代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* deleteNode(TreeNode* root, int key) {
        if(root == NULL)
            return NULL;
        if(root->val < key){
            root->right = deleteNode(root->right, key); //如果小于key,那么要寻找的key在右边
            return root;
        }else if(root->val > key){   
            root->left = deleteNode(root->left, key); //如果小于key,那么要寻找的key在左边
            return root;
        }else{              //如果等于key,那么要开始删除节点
            if(root->left == NULL){
                return root->right; //如果左子树为空,那么右子树为新节点
            }else if(root->right == NULL){
                return root->left;  //如果右子树为空,那么左子树为新节点
            }else{          //如果都不为空,右子树的最左节点为新的根
                TreeNode* needNode = root->right;
                while(needNode->left != NULL){
                    needNode = needNode->left;  //找到最左节点
                }
                needNode->right = deletMin(root->right);
                needNode->left = root->left;
                return needNode;
                
            }
        }
        
    }
    
    //删除节点
    TreeNode* deletMin(TreeNode* root){
        if(root->left == NULL)
            return root->right;
        root->left = deletMin(root->left);
        return root;
    }
};
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。