精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

修剪一棵二叉搜索樹,你會嗎?

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

[[422022]]

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

修剪二叉搜索樹

力扣鏈接:https://leetcode-cn.com/problems/trim-a-binary-search-tree/

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

思路

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

但還真的不簡單!

遞歸法

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

不難寫出如下代碼:

  1. class Solution { 
  2. public
  3.     TreeNode* trimBST(TreeNode* root, int low, int high) { 
  4.         if (root == nullptr || root->val < low || root->val > high) return nullptr; 
  5.         root->left = trimBST(root->left, low, high); 
  6.         root->right = trimBST(root->right, low, high); 
  7.         return root; 
  8.     } 
  9. }; 

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

我們在重新關注一下第二個示例,如圖:

669.修剪二叉搜索樹

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

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

其實不用重構那么復雜。

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

669.修剪二叉搜索樹1

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

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

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

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

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

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

代碼如下:

  1. TreeNode* trimBST(TreeNode* root, int low, int high) 
  • 確定終止條件

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

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

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

代碼如下:

  1. if (root->val < low) { 
  2.     TreeNode* right = trimBST(root->right, low, high); // 尋找符合區間[low, high]的節點 
  3.     return right

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

代碼如下:

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

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

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

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

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

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

669.修剪二叉搜索樹1

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

  1. if (root->val < low) { 
  2.     TreeNode* right = trimBST(root->right, low, high); // 尋找符合區間[low, high]的節點 
  3.     return right

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

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

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

最后整體代碼如下:

  1. class Solution { 
  2. public
  3.     TreeNode* trimBST(TreeNode* root, int low, int high) { 
  4.         if (root == nullptr ) return nullptr; 
  5.         if (root->val < low) { 
  6.             TreeNode* right = trimBST(root->right, low, high); // 尋找符合區間[low, high]的節點 
  7.             return right
  8.         } 
  9.         if (root->val > high) { 
  10.             TreeNode* left = trimBST(root->left, low, high); // 尋找符合區間[low, high]的節點 
  11.             return left
  12.         } 
  13.         root->left = trimBST(root->left, low, high); // root->left接入符合條件的左孩子 
  14.         root->right = trimBST(root->right, low, high); // root->right接入符合條件的右孩子 
  15.         return root; 
  16.     } 
  17. }; 

精簡之后代碼如下:

  1. class Solution { 
  2. public
  3.     TreeNode* trimBST(TreeNode* root, int low, int high) { 
  4.         if (root == nullptr) return nullptr; 
  5.         if (root->val < low) return trimBST(root->right, low, high); 
  6.         if (root->val > high) return trimBST(root->left, low, high); 
  7.         root->left = trimBST(root->left, low, high); 
  8.         root->right = trimBST(root->right, low, high); 
  9.         return root; 
  10.     } 
  11. }; 

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

迭代法

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

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

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

代碼如下:

  1. class Solution { 
  2. public
  3.     TreeNode* trimBST(TreeNode* root, int L, int R) { 
  4.         if (!root) return nullptr; 
  5.  
  6.         // 處理頭結點,讓root移動到[L, R] 范圍內,注意是左閉右閉 
  7.         while (root != nullptr && (root->val < L || root->val > R)) { 
  8.             if (root->val < L) root = root->right; // 小于L往右走 
  9.             else root = root->left; // 大于R往左走 
  10.         } 
  11.         TreeNode *cur = root; 
  12.         // 此時root已經在[L, R] 范圍內,處理左孩子元素小于L的情況 
  13.         while (cur != nullptr) { 
  14.             while (cur->left && cur->left->val < L) { 
  15.                 cur->left = cur->left->right
  16.             } 
  17.             cur = cur->left
  18.         } 
  19.         cur = root; 
  20.  
  21.         // 此時root已經在[L, R] 范圍內,處理右孩子大于R的情況 
  22.         while (cur != nullptr) { 
  23.             while (cur->right && cur->right->val > R) { 
  24.                 cur->right = cur->right->left
  25.             } 
  26.             cur = cur->right
  27.         } 
  28.         return root; 
  29.     } 
  30. }; 

總結

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

最終的代碼倒是很簡潔。

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

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

其他語言版本

Java

  1. class Solution { 
  2.     public TreeNode trimBST(TreeNode root, int low, int high) { 
  3.         if (root == null) { 
  4.             return null
  5.         } 
  6.         if (root.val < low) { 
  7.             return trimBST(root.right, low, high); 
  8.         } 
  9.         if (root.val > high) { 
  10.             return trimBST(root.left, low, high); 
  11.         } 
  12.         // root在[low,high]范圍內 
  13.         root.left = trimBST(root.left, low, high); 
  14.         root.right = trimBST(root.right, low, high); 
  15.         return root; 
  16.     } 

Python

  1. class Solution: 
  2.     def trimBST(self, root: TreeNode, low: int, high: int) -> TreeNode: 
  3.         if not root: return root 
  4.         if root.val < low: 
  5.             return self.trimBST(root.right,low,high)  // 尋找符合區間[low, high]的節點 
  6.         if root.val > high: 
  7.             return self.trimBST(root.left,low,high)  // 尋找符合區間[low, high]的節點 
  8.         root.left = self.trimBST(root.left,low,high)  // root->left接入符合條件的左孩子 
  9.         root.right = self.trimBST(root.right,low,high)   // root->right接入符合條件的右孩子 
  10.         return root 

本文轉載自微信公眾號「代碼隨想錄」,可以通過以下二維碼關注。轉載本文請聯系代碼隨想錄公眾號。

 

責任編輯:武曉燕 來源: 代碼隨想錄
相關推薦

2021-12-07 06:55:17

二叉搜索樹鏈表

2022-12-26 00:51:33

雙向鏈表二叉搜索樹

2021-08-31 11:35:24

二叉搜索樹迭代法公共祖先

2011-12-19 12:39:37

Java

2021-03-02 10:57:39

二叉樹二叉堆節點

2021-04-06 08:20:24

二叉搜索樹數據結構算法

2021-09-02 11:31:28

二叉搜索樹迭代法公共祖先

2022-01-11 10:01:25

二叉搜索樹數量

2023-07-31 08:01:13

二叉搜索測試

2021-09-03 08:58:00

二叉搜索樹節點

2020-04-27 07:05:58

二叉樹左子樹右子樹

2013-10-16 15:57:39

數組二叉樹

2011-08-01 13:51:31

Web

2021-07-13 14:03:24

二叉樹滿二叉樹完全二叉樹

2024-01-17 07:36:50

二叉搜索聯系簿

2021-08-26 11:31:11

二叉樹數據結構算法

2021-09-07 11:01:41

二叉搜索樹序數組

2023-02-13 08:02:08

哈希函數哈希表搜索樹

2023-08-29 08:31:13

B+樹數據索引

2021-05-06 17:46:30

二叉樹數據結構
點贊
收藏

51CTO技術棧公眾號

一区二区福利| 91欧美日韩在线| 国产精品久久午夜| 97久久天天综合色天天综合色hd| 精品97人妻无码中文永久在线| 亚洲精品一区二区三区在线| 欧美小视频在线观看| 色狠狠久久av五月综合| 国产精品毛片一区视频播| 一区视频在线| 中文字幕日韩综合av| 少妇愉情理伦片bd| 亚洲小少妇裸体bbw| 国产精品国产馆在线真实露脸| 懂色中文一区二区三区在线视频| 国产一区二区视频免费| 欧美日韩成人| 亚洲日本成人网| 亚洲熟女一区二区三区| 姬川优奈av一区二区在线电影| 亚洲男人都懂的| 欧美精品中文字幕一区二区| 国产精品国产一区二区三区四区 | 日本美女一区二区三区视频| 欧美激情日韩图片| 999久久久国产| 丝袜美腿综合| 精品少妇一区二区三区在线播放| 性欧美极品xxxx欧美一区二区| 免费在线观看av电影| 久久精品免费在线观看| 成人羞羞视频免费| 国产一区二区在线视频观看| 先锋影音久久| 欧美高清激情视频| 黑人操日本美女| 精品久久精品| 亚洲精品自产拍| 在线天堂www在线国语对白| 日韩av黄色| 精品视频全国免费看| av之家在线观看| 欧美videos另类精品| 中文字幕一区日韩精品欧美| 色姑娘综合网| 国产三级在线观看| 久久久噜噜噜久噜久久综合| 国产伦精品一区二区三区| 国产视频aaa| 久久国产福利国产秒拍| 国产黑人绿帽在线第一区| 亚洲久久在线观看| 国产人成精品一区二区三| 欧美激情一区二区三区在线视频观看| 国产精品无码久久久久久| 老司机成人在线| 精品福利在线导航| 在线精品视频播放| 成人知道污网站| 精品国内片67194| 老司机av网站| av成人综合| 亚洲成年人在线播放| 亚洲美女精品视频| 欧美一区 二区| 日韩精品在线观看一区二区| 国精产品一区一区三区免费视频| 国产日产一区| 这里只有视频精品| 亚洲一二三四五六区| 97精品在线| 欧美大奶子在线| 久久中文字幕无码| 亚洲作爱视频| 日韩美女视频在线观看| 国产免费a视频| 美女一区二区久久| 1卡2卡3卡精品视频| 国产成人无码www免费视频播放| 国产98色在线|日韩| 好吊色欧美一区二区三区 | 久久久人成影片一区二区三区在哪下载| 欧美色视频日本高清在线观看| 久久这里只有精品23| 第一福利在线视频| 色8久久人人97超碰香蕉987| 亚洲一级片网站| 美女精品久久| 亚洲精品99久久久久| 最近中文字幕免费| 五月天激情综合网| 韩国精品久久久999| 五月天婷婷久久| 久久超碰97中文字幕| 国产福利久久精品| 黑人与亚洲人色ⅹvideos| 国产精品久久久久久久久久久免费看| www.激情网| 日本综合字幕| 日韩一区二区三区精品视频| 91中文字幕永久在线| 亚洲一级淫片| 日本精品久久久久久久| 国产乱码精品一区二区| 91美女视频网站| 自拍亚洲欧美老师丝袜| 天堂电影一区| 日韩午夜精品电影| 男人天堂av电影| 国产精品mm| 国产精品免费网站| 老熟妇高潮一区二区高清视频| 国产日韩精品视频一区| 成人一级生活片| 免费在线成人激情电影| 亚洲福利视频久久| 国产免费无码一区二区视频| 日韩精品国产精品| 国产日韩欧美一区二区三区四区| 三区四区电影在线观看| 福利视频一区二区| 少妇献身老头系列| 亚洲精品成人无限看| 国产精品日韩久久久久| 日韩在线免费看| 亚洲妇女屁股眼交7| 欧美在线a视频| 欧美一区二区三区激情视频| 久久久亚洲成人| 国产色综合视频| 国产精品三级视频| 国产天堂在线播放| 青青视频一区二区| 国内揄拍国内精品少妇国语| 国产特级黄色片| 国产精品久久久99| 色播五月综合网| 国产真实有声精品录音| 97在线观看免费高清| 亚洲乱色熟女一区二区三区| 亚洲视频中文字幕| 日韩av.com| 天天综合一区| 91精品久久久久久久久中文字幕 | 欧美性猛交xxxx乱大交hd| aaa国产一区| 久无码久无码av无码| 视频精品一区二区三区| 久久99久国产精品黄毛片入口| 国产美女无遮挡永久免费| 中文字幕一区免费在线观看| 中文字幕日韩综合| 五月天综合网站| **亚洲第一综合导航网站| 黄色一级大片在线免费看产| 在线成人免费视频| 国产精品精品软件男同| 国产乱人伦精品一区二区在线观看 | 美女扒开大腿让男人桶| 国产欧美三级电影| 午夜伦理精品一区| 无码国产伦一区二区三区视频| 亚洲二区在线视频| 欧美精品欧美极品欧美激情| 亚洲综合精品四区| 色噜噜狠狠色综合网| 久久久久黄色| 久久99国产综合精品女同| 亚洲国产精彩视频| 性做久久久久久免费观看欧美| 先锋资源av在线| 久久一区二区三区四区五区 | 色综合久久网女同蕾丝边| 欧美日韩一区二区精品| 色一情一交一乱一区二区三区| 日本视频中文字幕一区二区三区| 一本色道久久综合亚洲精品婷婷| 亚洲精品69| 欧美精品电影免费在线观看| 亚洲 欧美 自拍偷拍| 91福利区一区二区三区| 99热这里只有精品4| 懂色av中文一区二区三区| 欧美激情视频免费看| 久久av超碰| 成人免费视频网址| cao在线视频| 原创国产精品91| av免费观看网址| 精品久久久久久久久久久久| www亚洲色图| 成人综合在线观看| www.超碰com| 欧美激情aⅴ一区二区三区| 久久综合九色99| 四虎在线精品| 欧美在线视频网| 里番在线观看网站| 亚洲精品久久久久久久久久久久久| 91黑人精品一区二区三区| 亚洲日本在线天堂| 91精品人妻一区二区| 国产剧情av麻豆香蕉精品| www国产黄色| 欧美精品1区| 日韩国产精品一区二区三区| 亚洲免费一区三区| 国产精品揄拍500视频| 成人在线免费观看黄色| 日韩中文字幕在线视频播放| 手机看片一区二区三区| 91精品欧美一区二区三区综合在| 日本一区二区三区精品| 亚洲黄色片在线观看| 欧美丰满美乳xxⅹ高潮www| 成人永久免费视频| 青青草原国产在线视频| 香蕉成人久久| 日韩美女爱爱视频| 国产精品97| 欧美资源一区| 国产日韩三级| 91九色国产视频| 国产精品一区二区免费福利视频| 午夜欧美大片免费观看| 免费在线看黄| 亚洲一区二区久久| 天堂在线资源库| 欧美大片日本大片免费观看| 一级特黄录像免费看| 91久久精品一区二区| 日韩精品一区二区三| 亚洲在线视频一区| 加勒比婷婷色综合久久| 国产精品家庭影院| b站大片免费直播| 91美女片黄在线| 国产精品久久久免费观看| 成人黄色av电影| 美女日批在线观看| 国产在线日韩欧美| 天堂一区在线观看| 久久视频一区| 精品国产成人av在线免| 美女国产一区| 欧洲熟妇精品视频| 青青草97国产精品免费观看| 免费看a级黄色片| 日韩精品国产欧美| 少妇一级淫免费播放| 麻豆一区二区三区| 久国产精品视频| 精品亚洲porn| 性久久久久久久久久久久久久| 狠狠色丁香久久婷婷综合丁香| 色播五月综合网| 国产在线视频不卡二| 国产成人av免费观看| 国产一区不卡视频| 国产艳妇疯狂做爰视频 | 亚洲激情综合| 久激情内射婷内射蜜桃| 中文在线不卡| 粗暴91大变态调教| 蜜臀精品一区二区三区在线观看| 中文字幕网av| 激情综合色综合久久综合| 午夜诱惑痒痒网| 国产成人av电影| 欧美xxxx×黑人性爽| www亚洲一区| 欧美xxxx精品| 亚洲蜜臀av乱码久久精品| 久久久久无码国产精品不卡| 精品久久中文字幕久久av| 日批视频免费在线观看| 欧美日韩国产乱码电影| 国产不卡av在线播放| 亚洲国产女人aaa毛片在线| 手机福利在线| 日韩在线免费视频| 国产区美女在线| 日韩男女性生活视频| 日韩色性视频| 黑人另类av| 日韩在线观看一区 | 国产精品九九九九九| 中文字幕欧美三区| 中文字幕在线2021| 天天色天天操综合| 亚洲天堂狠狠干| 精品国产露脸精彩对白| 国产精品一二三区视频| 欧美麻豆久久久久久中文| 在线人成日本视频| 91亚洲精品久久久| 亚洲精品中文字幕99999| 中文字幕一区二区三区最新| 亚洲视频大全| 激情图片中文字幕| 久久亚洲一级片| a级黄色片免费看| 91黄色小视频| 国 产 黄 色 大 片| 日韩一区在线视频| 综合日韩av| 国产精品yjizz| 99久久婷婷| 国产精品欧美激情在线观看| 国产麻豆成人传媒免费观看| 久操视频在线观看免费| 午夜私人影院久久久久| 中文字幕在线观看精品| 精品动漫一区二区三区在线观看| av男人的天堂在线| 97国产精品视频| 精品视频一区二区三区在线观看 | 国产精品成人a在线观看| av免费观看网| 国产成人一区二区精品非洲| 女人十八毛片嫩草av| 欧美日韩国产精品一区二区不卡中文| 国产精品久久影视| 尤物精品国产第一福利三区| 综合日韩av| 精品久久久久久中文字幕动漫| 自拍偷拍欧美| 伊人网在线综合| 国产欧美日韩不卡| 超碰中文字幕在线| 亚洲电影免费观看高清| 在线中文免费视频| 成人亚洲激情网| 三区四区不卡| 在线观看免费黄网站| 91啪亚洲精品| 97人人澡人人爽人人模亚洲 | 国产精品成人v| 亚洲a级精品| www.浪潮av.com| 99久久精品国产麻豆演员表| 久草视频在线免费看| 日韩一级二级三级| av在线播放观看| 亚洲综合av影视| 影音先锋日韩在线| 亚洲精品国产一区二区三区| 中文字幕不卡的av| 中文区中文字幕免费看| 中文字幕日韩高清| 美女视频一区| 亚洲天堂av免费在线观看| 久久成人久久鬼色| 538精品在线视频| 日韩午夜在线播放| av免费不卡国产观看| 久久av免费观看| 亚洲欧美日韩国产一区| 中文字幕国产综合| 欧美性感一区二区三区| 亚洲天天影视| 91九色国产视频| 亚洲午夜久久久久久尤物 | 久久精品色综合| 九色在线视频观看| 国产网站一区二区三区| 中国老头性行为xxxx| 久久久精品2019中文字幕神马| 国产精品xnxxcom| 黄网站欧美内射| 久久久久88色偷偷免费| 中文字幕一区二区在线视频| 久久精品2019中文字幕| 91成人短视频| 国产乱子伦农村叉叉叉| 欧美国产国产综合| 国产日韩欧美一区二区东京热 | 在线观看精品视频| 国产精品18久久久久久久久| 日韩特黄一级片| 亚洲人高潮女人毛茸茸| 国产精品一区三区在线观看| bt天堂新版中文在线地址| 久久网站最新地址| 亚洲天堂手机版| 久久久久久久久91| 国产一区二区三区四区大秀| 五月天开心婷婷| 香蕉影视欧美成人| 91青青在线视频| 国产福利久久| 老司机免费视频一区二区| 国产一级在线免费观看| 亚洲色图av在线| 在线播放一区二区精品视频| 50路60路老熟妇啪啪| 亚洲另类在线视频| 巨骚激情综合| 国产成人女人毛片视频在线| 琪琪一区二区三区|