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

简介: leetcode 450删除二叉搜索树中的节点

删除二叉搜索树中的节点


14345e9c52ea45f69a30965954bc31e4.png

递归法

/**
 * 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* traversal(TreeNode* cur , int key)
    {
      //当为空节点的时候直接返回
        if(cur==nullptr) return cur;
    //当前值为目标值时
        if(cur->val == key)
        {
          //当前点的左右子树都是空,删除节点返回
            if(cur->left == nullptr && cur->right == nullptr) 
            {
                delete cur;
                return nullptr;
            }
            //左子树存在,右子树空,左孩子作为新的根节点返回
            else if(cur->left != nullptr && cur->right == nullptr)
            {
                auto tmp = cur->left;
                delete cur;
                return tmp;
            }
            //左子树为空,右子树存在,右子树作为新的根节点返回
            else if(cur->left == nullptr && cur->right != nullptr)
            {
                auto tmp = cur->right;
                delete cur;
                return tmp;
            }
            //左右子树都存在,令右孩子为新的根节点,左子树放到右子树的最左边。
            else
            {
                TreeNode* tmp = cur->right;
                while(tmp->left !=nullptr)
                {
                    tmp = tmp->left;
                }
                tmp->left = cur->left;
                TreeNode* result = cur->right;
                delete cur;
                return result;
            }
        }
        //当前值不是目标值,按照二叉搜索树单边遍历
        if(cur->val > key) cur->left = traversal(cur->left , key);
        if(cur->val < key) cur->right = traversal(cur->right , key);
        return cur;
    }
    TreeNode* deleteNode(TreeNode* root, int key) {
        if(root==nullptr) return nullptr;
        return traversal(root,key);
    }
};

二刷

/**
 * 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* track_back(TreeNode* cur , int key)
    {
        if(cur == nullptr) return nullptr;
        else if(cur->left == nullptr && cur->right == nullptr && cur->val == key) return nullptr;
        else if(cur->left == nullptr && cur->right != nullptr && cur->val == key) return cur->right;
        else if(cur->left != nullptr && cur->right == nullptr && cur->val == key) return cur->left;
        if(cur->val == key)
        {
            TreeNode* tmp = cur->right;
            while(tmp->left != nullptr)
                tmp = tmp->left;
            tmp->left = cur->left;
            return  cur->right;
        }
        if(cur->val > key) cur->left = track_back(cur->left , key);
        if(cur->val < key) cur->right = track_back(cur->right , key);
        return cur;
    }
    TreeNode* deleteNode(TreeNode* root, int key) {
        return track_back(root,key);
    }
};
相关文章
|
1天前
【Leetcode 2487】从链表中移除节点 —— 单调栈
解题思路:维持一个单调递增栈,当栈为空时,记录当前节点为头节点;否则当前节点为栈顶节点的后继节点
LeetCode | 面试题 02.02. 返回倒数第 k 个节点
LeetCode | 面试题 02.02. 返回倒数第 k 个节点
|
1天前
leetcode代码记录(不同的二叉搜索树
leetcode代码记录(不同的二叉搜索树
8 0
|
1天前
leetcode代码记录(完全二叉树的节点个数
leetcode代码记录(完全二叉树的节点个数
7 1
Leetcode1038. 从二叉搜索树到更大和树(每日一题)
Leetcode1038. 从二叉搜索树到更大和树(每日一题)
|
1天前
leetcode2487.从链表中移除节点
leetcode2487.从链表中移除节点
20 1
|
1天前
|
C语言
【C语言】Leetcode 876. 链表的中间节点
【C语言】Leetcode 876. 链表的中间节点
19 0
|
1天前
|
Java
LeetCode题解-二叉搜索树中第K小的元素-Java
LeetCode题解-二叉搜索树中第K小的元素-Java
13 0
|
1天前
|
Java
LeetCode题解- 两两交换链表中的节点-Java
两两交换链表中的节点-Java
14 0
|
1天前
|
算法
代码随想录Day34 LeetCode T343整数拆分 T96 不同的二叉搜索树
代码随想录Day34 LeetCode T343整数拆分 T96 不同的二叉搜索树
32 0