leetcode 669修剪二叉搜索树

简介: leetcode 669修剪二叉搜索树

修剪二叉搜索树


afb8fb32e5c240268869b867bd91ba33.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* cut_tree(TreeNode* cur, int low, int high)
    {
        if(cur==nullptr) return cur;
        cur->left =  cut_tree(cur->left , low , high);
        cur->right =  cut_tree(cur->right , low , high);
    //当前值是边界值剪切
        if(cur->val == low) cur->left = nullptr;
        else if(cur->val == high) cur->right = nullptr;
        //当前值超出边界值剪切
        else if(cur->val < low)
        {
            TreeNode * tmp = cur;
            while(tmp->right != nullptr && tmp->right->val  < low)
            {
                tmp = tmp->right;
            } 
            if(tmp->right == nullptr) return nullptr;
            else return tmp->right; 
        }
        else if(cur->val > high)
        {
            TreeNode * tmp = cur;
            while(tmp->left != nullptr && tmp->left->val  > high)
            {
                tmp = tmp->left;
            } 
            if(tmp->left == nullptr) return nullptr;
            else return tmp->left; 
        }
        return cur;
    }
    TreeNode* trimBST(TreeNode* root, int low, int high) {
        return cut_tree(root,low,high);
    }
};

递归回溯非剪切

/**
 * 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* cut_tree(TreeNode* cur, int low, int high)
    {
        if(cur==nullptr) return cur;
        if(cur->val < low) return cut_tree(cur->right,low,high);
        if(cur->val > high) return cut_tree(cur->left,low,high);
        cur->left = cut_tree(cur->left,low,high);
        cur->right = cut_tree(cur->right,low,high);
        return cur;
    }
    TreeNode* trimBST(TreeNode* root, int low, int high) {
        return cut_tree(root,low,high);
    }
};

二刷

/**
 * 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 low, int high) 
    {
        if(cur == nullptr ) return nullptr;
        if(cur->val < low )
        {
            return track_back(cur->right  , low , high);
        }
        else if(cur->val > high )
        {
            return  track_back(cur->left , low , high);
        }
        cur->left = track_back(cur->left  , low , high);
        cur->right = track_back(cur->right , low , high);
        return cur;
    }
    TreeNode* trimBST(TreeNode* root, int low, int high) {
        return track_back(root,low,high);
    }
};
相关文章
|
16天前
【LeetCode 45】701.二叉搜索树中的插入操作
【LeetCode 45】701.二叉搜索树中的插入操作
9 1
|
16天前
【LeetCode 44】235.二叉搜索树的最近公共祖先
【LeetCode 44】235.二叉搜索树的最近公共祖先
12 1
|
16天前
【LeetCode 48】108.将有序数组转换为二叉搜索树
【LeetCode 48】108.将有序数组转换为二叉搜索树
31 0
|
16天前
【LeetCode 47】669.修剪二叉搜索树
【LeetCode 47】669.修剪二叉搜索树
8 0
|
16天前
【LeetCode 46】450.删除二叉搜索树的节点
【LeetCode 46】450.删除二叉搜索树的节点
10 0
|
16天前
【LeetCode 42】501.二叉搜索树中的众数
【LeetCode 42】501.二叉搜索树中的众数
8 0
|
16天前
【LeetCode 41】530.二叉搜索树的最小绝对差
【LeetCode 41】530.二叉搜索树的最小绝对差
8 0
|
16天前
【LeetCode 40】98.验证二叉搜索树
【LeetCode 40】98.验证二叉搜索树
10 0
|
16天前
【LeetCode 39】700.二叉搜索树中的搜索
【LeetCode 39】700.二叉搜索树中的搜索
12 0
|
3月前
|
算法
LeetCode第96题不同的二叉搜索树
文章介绍了LeetCode第96题"不同的二叉搜索树"的解法,利用动态规划的思想和递推公式,通过计算以任意节点为根的不同二叉搜索树的数量,解决了该问题。
LeetCode第96题不同的二叉搜索树