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);
    }
};
相关文章
|
4月前
|
机器学习/深度学习 存储 算法
LeetCode 题目 95:从递归到动态规划实现 不同的二叉搜索树 II
LeetCode 题目 95:从递归到动态规划实现 不同的二叉搜索树 II
|
2月前
|
Python
【Leetcode刷题Python】450. 删除二叉搜索树中的节点
LeetCode上538号问题"把二叉搜索树转换为累加树"的Python实现,使用反向中序遍历并记录节点值之和来更新每个节点的新值。
28 4
【Leetcode刷题Python】450. 删除二叉搜索树中的节点
|
2月前
|
Python
【Leetcode刷题Python】96. 不同的二叉搜索树
LeetCode 96题 "不同的二叉搜索树" 的Python解决方案,使用动态规划算法计算由1至n互不相同节点值组成的二叉搜索树的种数。
19 3
【Leetcode刷题Python】96. 不同的二叉搜索树
|
2月前
|
算法
LeetCode第96题不同的二叉搜索树
文章介绍了LeetCode第96题"不同的二叉搜索树"的解法,利用动态规划的思想和递推公式,通过计算以任意节点为根的不同二叉搜索树的数量,解决了该问题。
LeetCode第96题不同的二叉搜索树
|
2月前
|
算法 Python
【Leetcode刷题Python】剑指 Offer 33. 二叉搜索树的后序遍历序列
本文提供了一种Python算法,用以判断给定整数数组是否为某二叉搜索树的后序遍历结果,通过识别根节点并递归验证左右子树的值是否满足二叉搜索树的性质。
17 3
|
2月前
|
Python
【Leetcode刷题Python】538. 把二叉搜索树转换为累加树
LeetCode上538号问题"把二叉搜索树转换为累加树"的Python实现,使用反向中序遍历并记录节点值之和来更新每个节点的新值。
19 3
|
2月前
|
Python
【Leetcode刷题Python】108. 将有序数组转换为二叉搜索树
LeetCode上108号问题"将有序数组转换为二叉搜索树"的Python实现,通过递归选取数组中间值作为根节点,构建高度平衡的二叉搜索树。
23 2
|
4月前
|
存储 算法 数据可视化
LeetCode 题目 96:从动态规划、递归到卡塔兰数实现不同的二叉搜索树
LeetCode 题目 96:从动态规划、递归到卡塔兰数实现不同的二叉搜索树
|
5月前
|
存储
【LeetCode】剑指 Offer 54. 二叉搜索树的第k大节点
【LeetCode】剑指 Offer 54. 二叉搜索树的第k大节点
40 1
|
4月前
|
存储 算法 数据挖掘
力扣173题:二叉搜索树迭代器(含模拟面试)
力扣173题:二叉搜索树迭代器(含模拟面试)