Java?C++?算法題解leetcode669修剪二叉搜索樹示例
更新時間:2022年09月14日 09:43:39 作者:AnjaVon
這篇文章主要為大家介紹了Java?C++?算法題解leetcode669修剪二叉搜索樹示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
題目要求


思路一:模擬迭代
- 依次判斷每個節(jié)點是否合法:
- 首先找出結(jié)果的根,若原根小了就拉右邊的過來,大了拉左邊的過來做新根;
- 然后分別判斷左右子樹的大小,由于二叉搜索樹的性質(zhì),子樹只需要判斷一邊就好:
- 左子樹判斷是否>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;
}
}
- 時間復(fù)雜度:O(n)
- 空間復(fù)雜度: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;
}
};
- 時間復(fù)雜度:O(n)
- 空間復(fù)雜度:O(1)
思路二:遞歸
- 直接用當(dāng)前函數(shù)遞歸修剪即可:
- 當(dāng)前值小了放右下(大)的值進(jìn)去,剪掉當(dāng)前和左邊節(jié)點;
- 當(dāng)前值大了放左下(?。┑闹颠M(jìn)去,剪掉當(dāng)前和右邊節(jié)點。
- 然后遞歸掉下面所有節(jié)點。
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;
}
}
- 時間復(fù)雜度:O(n)
- 空間復(fù)雜度: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;
}
};
- 時間復(fù)雜度:O(n)
- 空間復(fù)雜度:O(1),忽略遞歸的額外空間開銷
Rust
- 今天又見識到了新報錯:
already borrowed: BorrowMutError,不能把borrow的東西來回隨便等,要搞臨時中間變量,閉包要關(guān)好。
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
}
}
- 時間復(fù)雜度:O(n)
- 空間復(fù)雜度:O(1),忽略遞歸的額外空間開銷
以上就是Java C++ 算法題解leetcode669修剪二叉搜索樹的詳細(xì)內(nèi)容,更多關(guān)于Java C++ 算法修剪二叉搜索樹的資料請關(guān)注腳本之家其它相關(guān)文章!
您可能感興趣的文章:
相關(guān)文章
C/C++關(guān)于實現(xiàn)CAN信號的獲取方法
這篇文章主要介紹了C/C++關(guān)于實現(xiàn)CAN信號的獲取方法,標(biāo)準(zhǔn)的CAN 數(shù)據(jù)為8字節(jié),即64位,但是CAN FD的最大數(shù)據(jù)可為64字節(jié),為512位,其中的幀ID分為標(biāo)準(zhǔn)幀和擴(kuò)展幀,其中用11位標(biāo)準(zhǔn)幀,用29位表示擴(kuò)展幀2023-02-02
淺談C++中的構(gòu)造函數(shù)分類及調(diào)用規(guī)則
這篇文章主要介紹了C++中的構(gòu)造函數(shù)分類及調(diào)用規(guī)則,文中根據(jù)參數(shù)寫出了幾種不同類型的構(gòu)造函數(shù)并解釋了如何調(diào)用,需要的朋友可以參考下2016-03-03
C++類中的常數(shù)據(jù)成員與靜態(tài)數(shù)據(jù)成員之間的區(qū)別
常數(shù)據(jù)成員是指在類中定義的不能修改其值的一些數(shù)據(jù)成員,類似于我們以前學(xué)過的常變量,雖然是變量,也有自己的地址,但是一經(jīng)賦初值,便不能再被修改2013-10-10
VS2019 更新MSDN并創(chuàng)建快捷方式的實現(xiàn)
這篇文章主要介紹了VS2019 更新MSDN并創(chuàng)建快捷方式的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
win10環(huán)境下C++ vs2015編譯opencv249的教程
這篇文章主要介紹了win10環(huán)境下C++ vs2015編譯opencv249的教程,本文分步驟給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-03-03

