18video性欧美19sex,欧美高清videosddfsexhd,性少妇videosexfreexxx片中国,激情五月激情综合五月看花,亚洲人成网77777色在线播放

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何修剪二叉搜索樹(shù)

算法與數(shù)據(jù)結(jié)構(gòu) ? 來(lái)源:代碼隨想錄 ? 作者:程序員Carl ? 2021-10-11 14:16 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

如果不對(duì)遞歸有深刻的理解,本題有點(diǎn)難。單純移除一個(gè)節(jié)點(diǎn)那還不夠,要修剪!

669. 修剪二叉搜索樹(shù)

給定一個(gè)二叉搜索樹(shù),同時(shí)給定最小邊界L 和最大邊界 R。通過(guò)修剪二叉搜索樹(shù),使得所有節(jié)點(diǎn)的值在[L, R]中 (R>=L) 。你可能需要改變樹(shù)的根節(jié)點(diǎn),所以結(jié)果應(yīng)當(dāng)返回修剪好的二叉搜索樹(shù)的新的根節(jié)點(diǎn)。

思路

相信看到這道題目大家都感覺(jué)是一道簡(jiǎn)單題(事實(shí)上leetcode上也標(biāo)明是簡(jiǎn)單)。

但還真的不簡(jiǎn)單!

遞歸法

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

不難寫(xiě)出如下代碼:

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]區(qū)間在二叉搜索樹(shù)的中可不是單純的節(jié)點(diǎn)3和左孩子節(jié)點(diǎn)0就決定的,還要考慮節(jié)點(diǎn)0的右子樹(shù)。

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

從圖中可以看出需要重構(gòu)二叉樹(shù),想想是不是本題就有點(diǎn)復(fù)雜了。

其實(shí)不用重構(gòu)那么復(fù)雜。

在上圖中我們發(fā)現(xiàn)節(jié)點(diǎn)0并不符合區(qū)間要求,那么將節(jié)點(diǎn)0的右孩子 節(jié)點(diǎn)2 直接賦給 節(jié)點(diǎn)3的左孩子就可以了(就是把節(jié)點(diǎn)0從二叉樹(shù)中移除)

理解了最關(guān)鍵部分了我們?cè)谶f歸三部曲:

  • 確定遞歸函數(shù)的參數(shù)以及返回值

這里我們?yōu)槭裁葱枰祷刂的兀?/p>

因?yàn)槭且闅v整棵樹(shù),做修改,其實(shí)不需要返回值也可以,我們也可以完成修剪(其實(shí)就是從二叉樹(shù)中移除節(jié)點(diǎn))的操作。

但是有返回值,更方便,可以通過(guò)遞歸函數(shù)的返回值來(lái)移除節(jié)點(diǎn)。

這樣的做法在二叉樹(shù):搜索樹(shù)中的插入操作二叉樹(shù):搜索樹(shù)中的刪除操作中大家已經(jīng)了解過(guò)了。

代碼如下:

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

修剪的操作并不是在終止條件上進(jìn)行的,所以就是遇到空節(jié)點(diǎn)返回就可以了。

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

如果root(當(dāng)前節(jié)點(diǎn))的元素小于low的數(shù)值,那么應(yīng)該遞歸右子樹(shù),并返回右子樹(shù)符合條件的頭結(jié)點(diǎn)。

代碼如下:

if(root->valright,low,high);//尋找符合區(qū)間[low,high]的節(jié)點(diǎn)
returnright;
}

如果root(當(dāng)前節(jié)點(diǎn))的元素大于high的,那么應(yīng)該遞歸左子樹(shù),并返回左子樹(shù)符合條件的頭結(jié)點(diǎn)。

代碼如下:

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

接下來(lái)要將下一層處理完左子樹(shù)的結(jié)果賦給root->left,處理完右子樹(shù)的結(jié)果賦給root->right。

最后返回root節(jié)點(diǎn),代碼如下:

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

此時(shí)大家是不是還沒(méi)發(fā)現(xiàn)這多余的節(jié)點(diǎn)究竟是如何從二叉樹(shù)中移除的呢?

在回顧一下上面的代碼,針對(duì)下圖中二叉樹(shù)的情況:

如下代碼相當(dāng)于把節(jié)點(diǎn)0的右孩子(節(jié)點(diǎn)2)返回給上一層,

if(root->valright,low,high);//尋找符合區(qū)間[low,high]的節(jié)點(diǎn)
returnright;
}

然后如下代碼相當(dāng)于用節(jié)點(diǎn)3的左孩子 把下一層返回的 節(jié)點(diǎn)0的右孩子(節(jié)點(diǎn)2) 接住。

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

此時(shí)節(jié)點(diǎn)3的右孩子就變成了節(jié)點(diǎn)2,將節(jié)點(diǎn)0從二叉樹(shù)中移除了。

最后整體代碼如下:

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

精簡(jiǎn)之后代碼如下:

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;
}
};

只看代碼,其實(shí)不太好理解節(jié)點(diǎn)是符合移除的,這一塊大家可以自己在模擬模擬!

迭代法

因?yàn)槎嫠阉鳂?shù)的有序性,不需要使用棧模擬遞歸的過(guò)程。

在剪枝的時(shí)候,可以分為三步:

  • 將root移動(dòng)到[L, R] 范圍內(nèi),注意是左閉右閉區(qū)間
  • 剪枝左子樹(shù)
  • 剪枝右子樹(shù)

代碼如下:

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

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

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

總結(jié)

修剪二叉搜索樹(shù)其實(shí)并不難,但在遞歸法中大家可看出我費(fèi)了很大的功夫來(lái)講解如何刪除節(jié)點(diǎn)的,這個(gè)思路其實(shí)是比較繞的。

最終的代碼倒是很簡(jiǎn)潔。

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

本題我依然給出遞歸法和迭代法,初學(xué)者掌握遞歸就可以了,如果想進(jìn)一步學(xué)習(xí),就把迭代法也寫(xiě)一寫(xiě)。

其他語(yǔ)言版本

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]范圍內(nèi)
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)//尋找符合區(qū)間[low,high]的節(jié)點(diǎn)
ifroot.val>high:
returnself.trimBST(root.left,low,high)//尋找符合區(qū)間[low,high]的節(jié)點(diǎn)
root.left=self.trimBST(root.left,low,high)//root->left接入符合條件的左孩子
root.right=self.trimBST(root.right,low,high)//root->right接入符合條件的右孩子
returnroot
責(zé)任編輯:haq

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 源代碼
    +關(guān)注

    關(guān)注

    96

    文章

    2953

    瀏覽量

    69403
  • 二叉樹(shù)
    +關(guān)注

    關(guān)注

    0

    文章

    74

    瀏覽量

    12830

原文標(biāo)題:修剪一棵二叉搜索樹(shù)

文章出處:【微信號(hào):TheAlgorithm,微信公眾號(hào):算法與數(shù)據(jù)結(jié)構(gòu)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    請(qǐng)問(wèn)rtt studio 的文件夾打紅什么意思?

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

    產(chǎn)品搜索與過(guò)濾API接口

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

    億緯鋰能榮獲杭集團(tuán)2022-2024年度優(yōu)秀供應(yīng)商獎(jiǎng)

    近日,億緯鋰能憑借卓越產(chǎn)品、可靠交付與優(yōu)質(zhì)服務(wù)榮獲杭集團(tuán)頒發(fā)的“2022-2024年度優(yōu)秀供應(yīng)商”獎(jiǎng)。杭集團(tuán)副總經(jīng)理兼杭電器董事長(zhǎng)金華曙、杭電器總經(jīng)理兼杭博電機(jī)總經(jīng)理李明輝出席
    的頭像 發(fā)表于 07-15 09:00 ?661次閱讀

    神經(jīng)網(wǎng)絡(luò)壓縮框架 (NNCF) 中的過(guò)濾器修剪統(tǒng)計(jì)數(shù)據(jù)怎么查看?

    無(wú)法觀察神經(jīng)網(wǎng)絡(luò)壓縮框架 (NNCF) 中的過(guò)濾器修剪統(tǒng)計(jì)數(shù)據(jù)
    發(fā)表于 03-06 07:10

    機(jī)器人看點(diǎn):宇樹(shù)科技王興興回上海母校 加速商業(yè)化落地 宇樹(shù)機(jī)器人手租賃火爆

    給大家?guī)?lái)一些機(jī)器人的消息: 宇樹(shù)科技王興興回上海母校 加速商業(yè)化落地 日前,宇樹(shù)科技創(chuàng)始人王興興在接受媒體專訪時(shí)候,介紹了公司的H1人形機(jī)器人的技術(shù)亮點(diǎn)及行業(yè)前景,H1人形機(jī)器人是首款能原地后翻出
    的頭像 發(fā)表于 02-25 11:26 ?1677次閱讀

    求解答,設(shè)備樹(shù)問(wèn)題

    請(qǐng)問(wèn),rk3588j要再提取一個(gè)USB3.0接口設(shè)備樹(shù)怎么改
    發(fā)表于 02-20 11:22

    labview 搜索藍(lán)牙設(shè)備函數(shù),搜索不到BLE設(shè)備

    請(qǐng)教一個(gè)問(wèn)題 labview自帶的搜索藍(lán)牙設(shè)備函數(shù),搜索不到BLE設(shè)備,這個(gè)該怎么解決?網(wǎng)上有評(píng)論說(shuō)是自帶的函數(shù)不支持搜索4.0以上的藍(lán)牙設(shè)備。 目前是想開(kāi)發(fā)一個(gè)藍(lán)牙通信上位機(jī),但是不走藍(lán)牙串口協(xié)議,而是服務(wù)和特性。
    發(fā)表于 02-20 10:04

    百度搜索全量上線DeepSeek滿血版,開(kāi)啟AI搜索新體驗(yàn)

    近日,百度搜索迎來(lái)了重大更新,全量上線了DeepSeek滿血版。這一更新意味著用戶現(xiàn)在可以在百度App中體驗(yàn)到更加智能、高效的搜索服務(wù)。 用戶只需在百度App中輸入任意搜索詞,完成一輪搜索
    的頭像 發(fā)表于 02-18 15:15 ?1790次閱讀

    百度搜索與文心智能體平臺(tái)接入DeepSeek及文心大模型深度搜索

    近日,百度搜索與文心智能體平臺(tái)聯(lián)合宣布了一項(xiàng)重要更新:將全面接入DeepSeek及文心大模型最新的深度搜索功能。這一更新將為用戶和開(kāi)發(fā)者帶來(lái)更加智能、高效的搜索和智能體創(chuàng)建體驗(yàn)。 據(jù)悉,搜索
    的頭像 發(fā)表于 02-17 09:14 ?877次閱讀

    Kaggle知識(shí)點(diǎn):7種超參數(shù)搜索方法

    數(shù)據(jù)科學(xué)超參數(shù)搜索確實(shí)是機(jī)器學(xué)習(xí)生命周期中不可或缺的一步,特別是在模型性能方面。正確的超參數(shù)選擇可以顯著提高模型的準(zhǔn)確性、對(duì)未見(jiàn)數(shù)據(jù)的泛化能力以及收斂速度。不當(dāng)?shù)某瑓?shù)選擇可能導(dǎo)致過(guò)擬合或欠擬合等
    的頭像 發(fā)表于 02-08 14:28 ?1492次閱讀
    Kaggle知識(shí)點(diǎn):7種超參數(shù)<b class='flag-5'>搜索</b>方法

    OpenAI免費(fèi)開(kāi)放ChatGPT搜索功能

    近日,OpenAI宣布了一項(xiàng)重大決策:向所有用戶免費(fèi)開(kāi)放ChatGPT搜索功能。這一舉措無(wú)疑將為用戶帶來(lái)更加高效、智能的搜索體驗(yàn)。 與谷歌等傳統(tǒng)搜索引擎的收錄模式相比,ChatGPT搜索
    的頭像 發(fā)表于 02-06 14:35 ?714次閱讀

    嵌入式學(xué)習(xí)-飛凌嵌入式ElfBoard ELF 1板卡-初識(shí)設(shè)備樹(shù)之設(shè)備樹(shù)組成和結(jié)構(gòu)

    的name和value。在設(shè)備樹(shù)中,可描述的信息包括:一、CPU的數(shù)量和類別;、內(nèi)存基地址和大?。蝗?、總線和橋;四、外設(shè)連接;五、中斷控制器和中斷使用情況;六、GPIO控制器和GPIO使用情況;七
    發(fā)表于 01-08 08:32

    飛凌嵌入式ElfBoard ELF 1板卡-初識(shí)設(shè)備樹(shù)之設(shè)備樹(shù)組成和結(jié)構(gòu)

    的name和value。在設(shè)備樹(shù)中,可描述的信息包括:一、CPU的數(shù)量和類別;、內(nèi)存基地址和大小;三、總線和橋;四、外設(shè)連接;五、中斷控制器和中斷使用情況;六、GPIO控制器和GPIO使用情況;七
    發(fā)表于 01-07 09:16

    OpenAI推出ChatGPT搜索功能

    近日,OpenAI再次邁出了重要的一步,為其廣受好評(píng)的ChatGPT平臺(tái)添加了一項(xiàng)全新的搜索功能。 據(jù)悉,這項(xiàng)被命名為“ChatGPT搜索”的新功能,將為用戶帶來(lái)前所未有的搜索體驗(yàn)。以往,當(dāng)用戶需要
    的頭像 發(fā)表于 11-04 10:34 ?838次閱讀

    OpenAI在ChatGPT增添搜索功能

    近日,OpenAI宣布為其旗艦產(chǎn)品ChatGPT增添全新的搜索功能,此舉標(biāo)志著該公司對(duì)Alphabet旗下谷歌的直接挑戰(zhàn)進(jìn)一步升級(jí)。OpenAI周四正式揭曉了這一名為“ChatGPT搜索”的新功能
    的頭像 發(fā)表于 11-01 17:01 ?902次閱讀