iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >Java C++ 算法题解leetcode669修剪二叉搜索树示例
  • 804
分享到

Java C++ 算法题解leetcode669修剪二叉搜索树示例

2024-04-02 19:04:59 804人浏览 安东尼
摘要

目录题目要求思路一:模拟迭代Javac++思路二:递归JavaC++Rust题目要求 思路一:模拟迭代 依次判断每个节点是否合法:首先找出结果的根,若原根小了就拉右边的过来,大了

题目要求

思路一:模拟迭代

  • 依次判断每个节点是否合法:
    • 首先找出结果的根,若原根小了就拉右边的过来,大了拉左边的过来做新根;
    • 然后分别判断左右子树的大小,由于二叉搜索树的性质,子树只需要判断一边就好:
      • 左子树判断是否>low,合法就向左下走,不合法往右下;
      • 右子树判断是否<high,合法就向右下走,不合法往左下。

Java

class Solution {
    public Treenode trimBST(TreeNode root, int low, int high) {
        while (root != null && (root.val < low || root.val > high)) // 确定原根是否合法
            root = root.val < low ? root.right : root.left;
        TreeNode res = root;
        while (root != null) {
            while (root.left != null && root.left.val < low)
                root.left = root.left.right;
            root = root.left;
        }
        root = res;
        while (root != null) {
            while (root.right != null && root.right.val > high)
                root.right = root.right.left;
            root = root.right;
        }
        return res;
    }
}
  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

C++

class Solution {
public:
    TreeNode* trimBST(TreeNode* root, int low, int high) {
        while (root != nullptr && (root->val < low || root->val > high)) // 确定原根是否合法
            root = root->val < low ? root->right : root->left;
        TreeNode* res = root;
        while (root != nullptr) {
            while (root->left != nullptr && root->left->val < low)
                root->left = root->left->right;
            root = root->left;
        }
        root = res;
        while (root != nullptr) {
            while (root->right != nullptr && root->right->val > high)
                root->right = root->right->left;
            root = root->right;
        }
        return res;
    }
};
  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

思路二:递归

  • 直接用当前函数递归修剪即可:
    • 当前值小了放右下(大)的值进去,剪掉当前和左边节点;
    • 当前值大了放左下(小)的值进去,剪掉当前和右边节点。
    • 然后递归掉下面所有节点。

Java

class Solution {
    public TreeNode trimBST(TreeNode root, int low, int high) {
        if (root == null)
            return null;
        if (root.val < low)
            return trimBST(root.right, low, high);
        else if (root.val > high)
            return trimBST(root.left, low, high);
        root.left = trimBST(root.left, low, high);
        root.right = trimBST(root.right, low, high);
        return root;
    }
}
  • 时间复杂度:O(n)
  • 空间复杂度:O(1),忽略递归的额外空间开销

C++

class Solution {
public:
    TreeNode* trimBST(TreeNode* root, int low, int high) {
        if (root == nullptr)
            return nullptr;
        if (root->val < low)
            return trimBST(root->right, low, high);
        else if (root->val > high)
            return trimBST(root->left, low, high);
        root->left = trimBST(root->left, low, high);
        root->right = trimBST(root->right, low, high);
        return root;
    }
};
  • 时间复杂度:O(n)
  • 空间复杂度:O(1),忽略递归的额外空间开销

Rust

  • 今天又见识到了新报错:already borrowed: BorrowMutError,不能把borrow的东西来回随便等,要搞临时中间变量,闭包要关好。
use std::rc::Rc;
use std::cell::RefCell;
impl Solution {
    pub fn trim_bst(root: Option<Rc<RefCell<TreeNode>>>, low: i32, high: i32) -> Option<Rc<RefCell<TreeNode>>> {
        if  root.is_none() {
            return None;
        }
        if root.as_ref().unwrap().borrow().val < low {
            return Solution::trim_bst(root.as_ref().unwrap().borrow().right.clone(), low, high);
        }
        else if root.as_ref().unwrap().borrow().val > high {
            return Solution::trim_bst(root.as_ref().unwrap().borrow().left.clone(), low, high);
        }
        let (l, r) = (Solution::trim_bst(root.as_ref().unwrap().borrow().left.clone(), low, high), Solution::trim_bst(root.as_ref().unwrap().borrow().right.clone(), low, high)); // 要先拎出来
        root.as_ref().unwrap().borrow_mut().left = l;
        root.as_ref().unwrap().borrow_mut().right = r;
        root
    }
}
  • 时间复杂度:O(n)
  • 空间复杂度:O(1),忽略递归的额外空间开销

以上就是Java C++ 算法题解LeetCode669修剪二叉搜索树的详细内容,更多关于Java C++ 算法修剪二叉搜索树的资料请关注编程网其它相关文章!

--结束END--

本文标题: Java C++ 算法题解leetcode669修剪二叉搜索树示例

本文链接: https://www.lsjlt.com/news/167476.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作