国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何修剪二叉搜索樹

算法與數據結構 ? 來源:代碼隨想錄 ? 作者:程序員Carl ? 2021-10-11 14:16 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

如果不對遞歸有深刻的理解,本題有點難。單純移除一個節點那還不夠,要修剪!

669. 修剪二叉搜索樹

給定一個二叉搜索樹,同時給定最小邊界L 和最大邊界 R。通過修剪二叉搜索樹,使得所有節點的值在[L, R]中 (R>=L) 。你可能需要改變樹的根節點,所以結果應當返回修剪好的二叉搜索樹的新的根節點。

思路

相信看到這道題目大家都感覺是一道簡單題(事實上leetcode上也標明是簡單)。

但還真的不簡單!

遞歸法

直接想法就是:遞歸處理,然后遇到root->val < low || root->val > high的時候直接return NULL,一波修改,趕緊利落。

不難寫出如下代碼:

classSolution{
public:
TreeNode*trimBST(TreeNode*root,intlow,inthigh){
if(root==nullptr||root->valval>high)returnnullptr;
root->left=trimBST(root->left,low,high);
root->right=trimBST(root->right,low,high);
returnroot;
}
};

然而[1, 3]區間在二叉搜索樹的中可不是單純的節點3和左孩子節點0就決定的,還要考慮節點0的右子樹

所以以上的代碼是不可行的!

從圖中可以看出需要重構二叉樹,想想是不是本題就有點復雜了。

其實不用重構那么復雜。

在上圖中我們發現節點0并不符合區間要求,那么將節點0的右孩子 節點2 直接賦給 節點3的左孩子就可以了(就是把節點0從二叉樹中移除)

理解了最關鍵部分了我們在遞歸三部曲:

  • 確定遞歸函數的參數以及返回值

這里我們為什么需要返回值呢?

因為是要遍歷整棵樹,做修改,其實不需要返回值也可以,我們也可以完成修剪(其實就是從二叉樹中移除節點)的操作。

但是有返回值,更方便,可以通過遞歸函數的返回值來移除節點。

這樣的做法在二叉樹:搜索樹中的插入操作二叉樹:搜索樹中的刪除操作中大家已經了解過了。

代碼如下:

TreeNode*trimBST(TreeNode*root,intlow,inthigh)
  • 確定終止條件

修剪的操作并不是在終止條件上進行的,所以就是遇到空節點返回就可以了。

if(root==nullptr)returnnullptr;
  • 確定單層遞歸的邏輯

如果root(當前節點)的元素小于low的數值,那么應該遞歸右子樹,并返回右子樹符合條件的頭結點。

代碼如下:

if(root->valright,low,high);//尋找符合區間[low,high]的節點
returnright;
}

如果root(當前節點)的元素大于high的,那么應該遞歸左子樹,并返回左子樹符合條件的頭結點。

代碼如下:

if(root->val>high){
TreeNode*left=trimBST(root->left,low,high);//尋找符合區間[low,high]的節點
returnleft;
}

接下來要將下一層處理完左子樹的結果賦給root->left,處理完右子樹的結果賦給root->right。

最后返回root節點,代碼如下:

root->left=trimBST(root->left,low,high);//root->left接入符合條件的左孩子
root->right=trimBST(root->right,low,high);//root->right接入符合條件的右孩子
returnroot;

此時大家是不是還沒發現這多余的節點究竟是如何從二叉樹中移除的呢?

在回顧一下上面的代碼,針對下圖中二叉樹的情況:

如下代碼相當于把節點0的右孩子(節點2)返回給上一層,

if(root->valright,low,high);//尋找符合區間[low,high]的節點
returnright;
}

然后如下代碼相當于用節點3的左孩子 把下一層返回的 節點0的右孩子(節點2) 接住。

root->left=trimBST(root->left,low,high);

此時節點3的右孩子就變成了節點2,將節點0從二叉樹中移除了。

最后整體代碼如下:

classSolution{
public:
TreeNode*trimBST(TreeNode*root,intlow,inthigh){
if(root==nullptr)returnnullptr;
if(root->valright,low,high);//尋找符合區間[low,high]的節點
returnright;
}
if(root->val>high){
TreeNode*left=trimBST(root->left,low,high);//尋找符合區間[low,high]的節點
returnleft;
}
root->left=trimBST(root->left,low,high);//root->left接入符合條件的左孩子
root->right=trimBST(root->right,low,high);//root->right接入符合條件的右孩子
returnroot;
}
};

精簡之后代碼如下:

classSolution{
public:
TreeNode*trimBST(TreeNode*root,intlow,inthigh){
if(root==nullptr)returnnullptr;
if(root->valreturntrimBST(root->right,low,high);
if(root->val>high)returntrimBST(root->left,low,high);
root->left=trimBST(root->left,low,high);
root->right=trimBST(root->right,low,high);
returnroot;
}
};

只看代碼,其實不太好理解節點是符合移除的,這一塊大家可以自己在模擬模擬!

迭代法

因為二叉搜索樹的有序性,不需要使用棧模擬遞歸的過程。

在剪枝的時候,可以分為三步:

  • 將root移動到[L, R] 范圍內,注意是左閉右閉區間
  • 剪枝左子樹
  • 剪枝右子樹

代碼如下:

classSolution{
public:
TreeNode*trimBST(TreeNode*root,intL,intR){
if(!root)returnnullptr;

//處理頭結點,讓root移動到[L,R]范圍內,注意是左閉右閉
while(root!=nullptr&&(root->valval>R)){
if(root->valright;//小于L往右走
elseroot=root->left;//大于R往左走
}
TreeNode*cur=root;
//此時root已經在[L,R]范圍內,處理左孩子元素小于L的情況
while(cur!=nullptr){
while(cur->left&&cur->left->valleft=cur->left->right;
}
cur=cur->left;
}
cur=root;

//此時root已經在[L,R]范圍內,處理右孩子大于R的情況
while(cur!=nullptr){
while(cur->right&&cur->right->val>R){
cur->right=cur->right->left;
}
cur=cur->right;
}
returnroot;
}
};

總結

修剪二叉搜索樹其實并不難,但在遞歸法中大家可看出我費了很大的功夫來講解如何刪除節點的,這個思路其實是比較繞的。

最終的代碼倒是很簡潔。

如果不對遞歸有深刻的理解,這道題目還是有難度的!

本題我依然給出遞歸法和迭代法,初學者掌握遞歸就可以了,如果想進一步學習,就把迭代法也寫一寫。

其他語言版本

Java

classSolution{
publicTreeNodetrimBST(TreeNoderoot,intlow,inthigh){
if(root==null){
returnnull;
}
if(root.valreturntrimBST(root.right,low,high);
}
if(root.val>high){
returntrimBST(root.left,low,high);
}
//root在[low,high]范圍內
root.left=trimBST(root.left,low,high);
root.right=trimBST(root.right,low,high);
returnroot;
}
}

Python

classSolution:
deftrimBST(self,root:TreeNode,low:int,high:int)->TreeNode:
ifnotroot:returnroot
ifroot.valreturnself.trimBST(root.right,low,high)//尋找符合區間[low,high]的節點
ifroot.val>high:
returnself.trimBST(root.left,low,high)//尋找符合區間[low,high]的節點
root.left=self.trimBST(root.left,low,high)//root->left接入符合條件的左孩子
root.right=self.trimBST(root.right,low,high)//root->right接入符合條件的右孩子
returnroot
責任編輯:haq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 源代碼
    +關注

    關注

    96

    文章

    2953

    瀏覽量

    70307
  • 二叉樹
    +關注

    關注

    0

    文章

    74

    瀏覽量

    12924

原文標題:修剪一棵二叉搜索樹

文章出處:【微信號:TheAlgorithm,微信公眾號:算法與數據結構】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    ???????使用 DMM Web API 獲取搜索列表數據

    ? ?DMM 平臺提供了豐富的 Web API 接口,允許開發者獲取其平臺上的各種數據。其中一個常用的接口是用于獲取搜索列表結果的 API。本文將介紹如何調用此 API 來獲取商品或內容的列表信息
    的頭像 發表于 02-09 15:34 ?152次閱讀
    ???????使用 DMM Web API 獲取<b class='flag-5'>搜索</b>列表數據

    TüV萊茵與杭集團達成戰略合作并頒發歐盟CE-MD符合性證書

    日前,國際獨立第三方檢測、檢驗和認證機構德國萊茵TüV大中華區(簡稱"TüV萊茵")與杭集團股份有限公司(簡稱"杭集團")簽署了戰略合作協議,標志著雙方
    的頭像 發表于 01-15 12:18 ?268次閱讀

    億緯鋰能與杭集團達成戰略合作

    近日,億緯鋰能與杭集團2025年戰略研討會暨戰略合作協議簽約儀式在杭州舉行。億緯鋰能副總裁、商用車電池產品線總裁江吉兵博士,億緯鋰能商用車電池產品線國內銷售部總經理井振江,杭集團董事、副總經理兼
    的頭像 發表于 01-04 18:18 ?1081次閱讀

    淘寶圖片搜索商品API指南

    一、摘要 淘寶圖片搜索商品API是基于圖像識別技術的智能搜索接口,允許用戶通過上傳商品圖片來搜索相似或同款商品。該接口廣泛應用于比價、找同款、商品識別等電商場景。 、接口概述 1.功
    的頭像 發表于 12-08 14:26 ?1193次閱讀

    線性搜索搜索介紹

    線性搜索(Linear Search):從數組的第一個元素開始,依次將當前元素與目標值進行比較,直到找到目標值或搜索完整個數組。 搜索(Binary Search):在有序數組中查
    發表于 12-01 07:36

    item_search-按關鍵字搜索商品列表API接口

    用戶提供更好的購物體驗。 、關鍵詞搜索API接口概述 淘寶關鍵詞搜索API接口是一個HTTP接口,支持GET請求。開發者可以通過該接口在淘寶上搜索商品,并獲取相關商品的信息。該接口提
    的頭像 發表于 11-16 17:13 ?260次閱讀

    通過優化代碼來提高MCU運行效率

    選擇時間復雜度低的算法。 根據訪問模式選擇數據結構。頻繁查找用哈希表,有序數據用二叉樹等。 查表法:對于復雜的數學計算(如sin, log),或者協議解析,預先計算好結果存于數組中,用空間換時間
    發表于 11-12 08:21

    按圖搜索1688商品的API接口

    ? ?在電商場景中,按圖搜索商品功能(即通過上傳圖片查找相似商品)極大提升了用戶體驗和效率。1688作為阿里巴巴旗下的批發平臺,雖然沒有直接公開的“按圖搜索”API,但我們可以借助阿里云的圖像搜索
    的頭像 發表于 10-22 15:05 ?608次閱讀
    按圖<b class='flag-5'>搜索</b>1688商品的API接口

    請問rtt studio 的文件夾打紅什么意思?

    rtt studio 的文件夾打紅什么意思?而且文件夾里面實際是有文件的,但是瀏覽不出來。
    發表于 09-18 06:34

    科技,被起訴

    電子發燒友網綜合報道 天眼查顯示,近日,杭州宇科技股份有限公司(以下簡稱“宇科技”)新增1條開庭公告,原告為杭州露韋美日化有限公司(以下簡稱“露韋美日化”),案由為侵害發明專利權糾紛,該案將于8
    的頭像 發表于 08-26 07:50 ?4919次閱讀
    宇<b class='flag-5'>樹</b>科技,被起訴

    產品搜索與過濾API接口

    ? 在現代化電子商務和應用程序開發中,高效的產品搜索與過濾功能至關重要。它能幫助用戶快速找到所需商品,提升用戶體驗和轉化率。產品搜索與過濾API接口作為后端服務的核心組件,允許開發者通過編程方式實現
    的頭像 發表于 07-24 14:35 ?561次閱讀
    產品<b class='flag-5'>搜索</b>與過濾API接口

    AI搜索一夜變天,專為Agent做搜索的賽道能否誕生百億美金新巨頭?

    ChatGPT剛剛給火熱的Agent市場添把柴,這邊AI搜索市場卻要變天。 Bing Search API將于8月11日關停,所有Bing Search API都將 完全停用 ,同時不再接受新用戶
    的頭像 發表于 07-24 13:59 ?659次閱讀
    AI<b class='flag-5'>搜索</b>一夜變天,專為Agent做<b class='flag-5'>搜索</b>的賽道能否誕生百億美金新巨頭?

    億緯鋰能榮獲杭集團2022-2024年度優秀供應商獎

    近日,億緯鋰能憑借卓越產品、可靠交付與優質服務榮獲杭集團頒發的“2022-2024年度優秀供應商”獎。杭集團副總經理兼杭電器董事長金華曙、杭電器總經理兼杭博電機總經理李明輝出席
    的頭像 發表于 07-15 09:00 ?981次閱讀

    白話理解RCC時鐘(可下載)

    時鐘就像是單片機的“心臟”,單片機正常工作離不開時鐘的支持,下圖是我們單片機的時鐘 ,它反映了單片機的時鐘關系。我們來詳細描述一下時鐘的工作原理。寄存器上電后有一個復位值,大家看我畫紅線的這個
    發表于 03-27 13:50 ?0次下載

    神經網絡壓縮框架 (NNCF) 中的過濾器修剪統計數據怎么查看?

    無法觀察神經網絡壓縮框架 (NNCF) 中的過濾器修剪統計數據
    發表于 03-06 07:10