最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java?C++?算法題解leetcode669修剪二叉搜索樹示例

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

題目要求

思路一:模擬迭代

  • 依次判斷每個(gè)節(jié)點(diǎn)是否合法:
    • 首先找出結(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;
    }
}
  • 時(shí)間復(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;
    }
};
  • 時(shí)間復(fù)雜度:O(n)
  • 空間復(fù)雜度:O(1)

思路二:遞歸

  • 直接用當(dāng)前函數(shù)遞歸修剪即可:
    • 當(dāng)前值小了放右下(大)的值進(jìn)去,剪掉當(dāng)前和左邊節(jié)點(diǎn);
    • 當(dāng)前值大了放左下(?。┑闹颠M(jìn)去,剪掉當(dāng)前和右邊節(jié)點(diǎn)。
    • 然后遞歸掉下面所有節(jié)點(diǎn)。

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;
    }
}
  • 時(shí)間復(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;
    }
};
  • 時(shí)間復(fù)雜度:O(n)
  • 空間復(fù)雜度:O(1),忽略遞歸的額外空間開銷

Rust

  • 今天又見識(shí)到了新報(bào)錯(cuò):already borrowed: BorrowMutError,不能把borrow的東西來回隨便等,要搞臨時(shí)中間變量,閉包要關(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
    }
}
  • 時(shí)間復(fù)雜度:O(n)
  • 空間復(fù)雜度:O(1),忽略遞歸的額外空間開銷

以上就是Java C++ 算法題解leetcode669修剪二叉搜索樹的詳細(xì)內(nèi)容,更多關(guān)于Java C++ 算法修剪二叉搜索樹的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 在C++中使用HP-Socket

    在C++中使用HP-Socket

    這篇文章主要介紹了C++中簡(jiǎn)單使用HP-Socket,HP-Socket 是一套通用的高性能 TCP/UDP /HTTP 通信 框架 ,包含服務(wù)端組件、客戶端組件和 Agent 組件,廣泛適用于各種不同應(yīng)用場(chǎng)景的 TCP/UDP /HTTP 通信系統(tǒng),下面來看看更具體的介紹吧
    2021-11-11
  • C/C++關(guān)于實(shí)現(xiàn)CAN信號(hào)的獲取方法

    C/C++關(guān)于實(shí)現(xiàn)CAN信號(hào)的獲取方法

    這篇文章主要介紹了C/C++關(guān)于實(shí)現(xiàn)CAN信號(hào)的獲取方法,標(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ī)則

    這篇文章主要介紹了C++中的構(gòu)造函數(shù)分類及調(diào)用規(guī)則,文中根據(jù)參數(shù)寫出了幾種不同類型的構(gòu)造函數(shù)并解釋了如何調(diào)用,需要的朋友可以參考下
    2016-03-03
  • C語言 位域詳解及示例代碼

    C語言 位域詳解及示例代碼

    本文主要介紹C語言 位域的知識(shí),這里整理了相關(guān)資料,并附示例代碼及詳解,有興趣的小伙伴可以參考下
    2016-08-08
  • C++類中的常數(shù)據(jù)成員與靜態(tài)數(shù)據(jù)成員之間的區(qū)別

    C++類中的常數(shù)據(jù)成員與靜態(tài)數(shù)據(jù)成員之間的區(qū)別

    常數(shù)據(jù)成員是指在類中定義的不能修改其值的一些數(shù)據(jù)成員,類似于我們以前學(xué)過的常變量,雖然是變量,也有自己的地址,但是一經(jīng)賦初值,便不能再被修改
    2013-10-10
  • C++ primer類的基礎(chǔ)精講

    C++ primer類的基礎(chǔ)精講

    C++類,是指系統(tǒng)在第一次在程序中遇到一個(gè)類時(shí)為這個(gè)類建立它的所有類變量的拷貝 - 這個(gè)類的所有實(shí)例共享它的類變量
    2022-07-07
  • C語言實(shí)現(xiàn)注冊(cè)登錄系統(tǒng)

    C語言實(shí)現(xiàn)注冊(cè)登錄系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)注冊(cè)登錄系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • VS2019 更新MSDN并創(chuàng)建快捷方式的實(shí)現(xiàn)

    VS2019 更新MSDN并創(chuàng)建快捷方式的實(shí)現(xiàn)

    這篇文章主要介紹了VS2019 更新MSDN并創(chuàng)建快捷方式的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • win10環(huán)境下C++ vs2015編譯opencv249的教程

    win10環(huán)境下C++ vs2015編譯opencv249的教程

    這篇文章主要介紹了win10環(huán)境下C++ vs2015編譯opencv249的教程,本文分步驟給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • C++中的并行與并發(fā)基礎(chǔ)與使用詳解

    C++中的并行與并發(fā)基礎(chǔ)與使用詳解

    對(duì)于多線程來說,這兩個(gè)概念有很大部分是重疊的。對(duì)于很多人來說,它們的意思沒有什么區(qū)別。其區(qū)別主要在于關(guān)注點(diǎn)和意圖方面(差距甚微)。這兩個(gè)詞都是用來對(duì)硬件在同時(shí)執(zhí)行多個(gè)任務(wù)的方式進(jìn)行描述的術(shù)語,不過并行更加注重性能
    2023-02-02

最新評(píng)論

灵山县| 兴义市| 搜索| 吴堡县| 咸阳市| 长春市| 油尖旺区| 金沙县| 务川| 大洼县| 临沧市| 靖州| 富阳市| 克拉玛依市| 西平县| 兴山县| 玉林市| 乾安县| 淄博市| 尤溪县| 绥江县| 萨嘎县| 宜都市| 汝南县| 固镇县| 安溪县| 叶城县| 雅安市| 广丰县| 图片| 卫辉市| 开化县| 图木舒克市| 永德县| 富锦市| 岚皋县| 晋城| 灵宝市| 牡丹江市| 丹江口市| 宁国市|