精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

成人在线中文字幕| 国产婷婷成人久久av免费高清| 视频一区二区综合| 国产又黄又大又粗的视频| 欧美成人激情| 精品久久久久一区二区国产| 91午夜在线观看| 四虎影院在线域名免费观看| 日韩国产欧美在线播放| 欧美精品制服第一页| av漫画在线观看| 成人性生活视频| 成人欧美一区二区三区白人| 91情侣在线视频| 天天综合网久久综合网| 欧美gay男男猛男无套| 欧美r级电影在线观看| 国产成人综合一区| 欧美一卡二卡| 国产精品福利一区二区| 国产一区在线免费观看| 这里只有精品免费视频| 国产综合色产| 日韩一区二区欧美| 日本japanese极品少妇| 996久久国产精品线观看| 欧美性少妇18aaaa视频| 四虎4hu永久免费入口| 国产中文字幕在线视频| 成人免费观看男女羞羞视频| 成人高清视频观看www| 伊人手机在线视频| 国内精品久久久久久久影视蜜臀| 国产一区二区三区欧美| 在线视频 日韩| 精品中文字幕一区二区三区| 欧美午夜影院一区| 无码精品a∨在线观看中文| 欧美边添边摸边做边爱免费| 久久久99精品免费观看| 精品蜜桃传媒| 成人午夜精品福利免费| 国产精品123| 成人a视频在线观看| 亚洲国产精品无码久久久| 国产欧美一区二区色老头| 欧美老女人性生活| 无码黑人精品一区二区| 欧美电影免费观看高清| 在线视频欧美性高潮| 亚洲国产av一区| 亚洲理论电影| 亚洲精品在线视频| 男生草女生视频| 视频福利一区| 国产视频久久网| 性色av蜜臀av色欲av| 加勒比久久高清| 亚洲精品在线一区二区| 国产视频精品视频| 精品成人自拍视频| 亚洲电影成人av99爱色| 精品一区二区视频在线观看| 高清精品视频| 日韩电影大片中文字幕| 国产激情第一页| 西野翔中文久久精品国产| 国产丝袜一区二区三区免费视频| www.自拍偷拍| 欧美日韩一区二区综合 | 欧美韩国理论所午夜片917电影| 一级黄色毛毛片| 99国内精品久久久久久久| www.欧美精品| 麻豆视频在线观看| 亚洲一区不卡| 国产精品www色诱视频| 在线视频你懂得| 久久精品国产精品亚洲红杏 | 免费拍拍拍网站| 碰碰在线视频| 欧美亚洲愉拍一区二区| gai在线观看免费高清| 国产va免费精品观看精品| 日韩欧美国产精品一区| 中国特级黄色大片| 精品盗摄女厕tp美女嘘嘘| 社区色欧美激情 | 国产盗摄一区二区三区在线| 亚洲国产欧美国产综合一区| 欧美最猛性xxxx| 中文字幕在线观看国产| 丁香亚洲综合激情啪啪综合| 久久国产手机看片| 免费a级在线播放| 亚洲成av人片观看| 国产视频1区2区3区| 午夜视频一区二区在线观看| 日韩精品免费综合视频在线播放| 日本黄色激情视频| 狠色狠色综合久久| 国产精品爽爽爽| 刘亦菲久久免费一区二区| 久久精品亚洲精品国产欧美| 亚洲精品偷拍视频| 蜜桃在线视频| 这里是久久伊人| aaaaaav| 999国产精品永久免费视频app| 欧美—级高清免费播放| 少妇无套内谢久久久久| 国产成人精品一区二区三区四区| 欧美精品国产精品久久久| 中文字幕在线观看网站| 日本韩国欧美在线| 亚洲欧美综合视频| 婷婷丁香综合| 日本高清不卡在线| 俄罗斯嫩小性bbwbbw| 亚洲欧洲日韩在线| 激情视频综合网| 久久综合社区| 久久91亚洲精品中文字幕| 中文av免费观看| 91啦中文在线观看| 久久久无码中文字幕久...| 欧美free嫩15| 亚洲欧美精品一区| 欧美日韩精品区| 国产91精品在线观看| 一区二区三区四区视频在线观看| 午夜影院一区| 精品播放一区二区| 久久久久久久久久久久国产| 精品夜夜嗨av一区二区三区| 日韩国产欧美一区| 澳门成人av网| 日韩精品在线观| 97人人澡人人爽人人模亚洲| 国产精品一区二区三区99| 在线观看欧美一区| 精品国产欧美日韩一区二区三区| 亚洲毛片在线看| 成人午夜淫片100集| 99re视频这里只有精品| 国产欧美日韩小视频| 精品伊人久久| 精品自在线视频| 亚洲国产精彩视频| 一区二区三区免费看视频| 性生活一级大片| 五月激情久久久| 亚洲综合第一页| a视频在线观看免费| 69堂成人精品免费视频| 四虎精品免费视频| 国产成人欧美日韩在线电影| 一二三在线视频| 视频一区日韩| 久久久免费精品| 亚洲欧美色视频| 色诱视频网站一区| 极品蜜桃臀肥臀-x88av| 蜜臀久久久久久久| 在线一区日本视频| 精品国产亚洲一区二区三区| 欧美高清视频一区二区| 国产91免费在线观看| 福利视频第一区| 中文字幕在线1| 麻豆成人在线观看| 韩国黄色一级大片| 高清精品视频| 国产91精品在线播放| 三级外国片在线观看视频| 91麻豆精品国产91| 久久在线视频精品| 国产亚洲午夜高清国产拍精品| 久久精品午夜福利| 天天做天天爱天天爽综合网| 成人av影视在线| 筱崎爱全乳无删减在线观看 | 91精品福利在线| 亚洲色图日韩精品| 国产成a人亚洲精品| 91视频 -- 69xx| 欧美亚洲精品在线| 97人人模人人爽人人喊38tv| 超级碰碰不卡在线视频| 亚洲欧美中文日韩在线| 亚洲影视一区二区| 精品国产91久久久久久| 美国黑人一级大黄| 丁香五精品蜜臀久久久久99网站 | 麻豆成人免费电影| av女优在线播放| 成人在线免费观看网站| 国产精品初高中精品久久| 欧美天堂视频| 美乳少妇欧美精品| 国产一级二级三级在线观看| 日韩一区二区在线观看视频 | 日本韩国欧美国产| avove在线播放| 久久久久9999亚洲精品| 在线观看免费看片| 日韩精品欧美精品| 日韩网站在线免费观看| 91日韩欧美| 蜜桃麻豆www久久国产精品| 成人午夜888| 国产成人自拍视频在线观看| 日韩av毛片| 精品国产美女在线| 头脑特工队2免费完整版在线观看| 欧美老人xxxx18| 亚洲熟妇无码乱子av电影| 一二三四区精品视频| 黄色精品视频在线观看| 久久奇米777| 国产伦精品一区二区三区88av| 日韩电影在线看| 欧美成人xxxxx| 国产主播精品| 精品免费久久久久久久| 日韩精品水蜜桃| 日韩中文一区| 西瓜成人精品人成网站| 国产区欧美区日韩区| 国产精品亚洲欧美一级在线| 国产精品久久久久久五月尺| 热色播在线视频| 久久琪琪电影院| 最新超碰在线| 久久久成人精品| 99免在线观看免费视频高清| 亚洲毛片在线看| 暖暖视频在线免费观看| 日韩电影在线观看中文字幕| 成人毛片在线精品国产| 精品久久99ma| 性一交一乱一乱一视频| 欧美精品1区2区| 国产精品九九九九| 欧美日本一区二区在线观看| 中文天堂在线视频| 欧美日韩一区二区欧美激情| 波多野结衣一区二区三区在线| 欧美日韩在线另类| 麻豆成人免费视频| 色综合激情久久| 国产在线观看第一页| 欧美性videosxxxxx| 亚洲最大成人av| 欧美裸体bbwbbwbbw| 国产精品人妻一区二区三区| 欧美日韩精品一区二区| 怡春院在线视频| 欧美丰满高潮xxxx喷水动漫| 国产精品久久久久久免费| 91精品国产乱码| 国内爆初菊对白视频| 亚洲第一黄色网| 偷拍25位美女撒尿视频在线观看| 亚洲国产小视频| 男男激情在线| 在线日韩av观看| 国产高清一区二区三区视频| 欧美福利小视频| 国产免费拔擦拔擦8x在线播放 | 国产一区一一区高清不卡| 国产精品色午夜在线观看| 国产欧美日韩电影| 国产伦精品一区二区| 一道本一区二区三区| 亚洲一区二区不卡视频| 欧美日韩国产色综合一二三四| 国产精品久久久久9999爆乳| 亚洲视频成人| www亚洲成人| 国产精品一区二区三区99| 国产精品久久无码| 国产欧美日韩久久| 九九热国产在线| 欧美视频免费在线| 97超碰国产在线| 精品久久久久久久久久久久久久久| 手机av在线免费观看| 亚洲欧美制服丝袜| 伊人精品影院| 国产精品劲爆视频| 亚洲成人黄色| 日韩视频在线播放| 伊人久久亚洲热| 牛夜精品久久久久久久| 国产精品亚洲午夜一区二区三区| 一本加勒比波多野结衣| 国产精品国产三级国产aⅴ无密码| 欧美成人aaa片一区国产精品| 狠狠做深爱婷婷久久综合一区| 亚洲一区二区三区网站| 亚洲国产成人精品一区二区 | 美女少妇精品视频| 三级成人黄色影院| 粉嫩av一区二区三区免费观看| 精品久久不卡| 免费一级特黄特色毛片久久看| 麻豆精品久久精品色综合| 91丨porny丨对白| 亚洲欧美日韩国产成人精品影院| av大片免费观看| 日韩一区二区免费在线电影| 搞黄视频免费在线观看| 91av在线影院| 日韩在线观看中文字幕| 亚洲欧美丝袜| 久久激情中文| 污污污www精品国产网站| 亚洲天堂久久久久久久| 国产免费一级视频| 亚洲精品国产精品国自产在线| 国产一二三区在线观看| 国产精品日韩在线| 伊人成综合网yiren22| 欧美大黑帍在线播放| 韩国欧美国产1区| 三区四区在线观看| 日本韩国欧美国产| 欧美一级淫片aaaaaa| 欧美猛交ⅹxxx乱大交视频| 亚洲免费一区| 在线播放豆国产99亚洲| 蜜桃视频在线观看一区二区| wwwwxxxx国产| 欧美日韩亚洲一区二区| 婷婷在线免费视频| 久久免费视频网| 4438全国亚洲精品观看视频| 50度灰在线观看| 精品一区二区久久久| 亚洲一区电影在线观看| 欧美妇女性影城| 黄色免费在线观看| 国产精品亚洲激情| 日韩久久视频| 毛片av免费在线观看| 久久亚洲欧美国产精品乐播 | 欧美日韩一区小说| 国产黄在线看| 国产精品久久网| 日韩欧美一区二区三区在线视频| 亚洲三级视频网站| 国产精品视频一区二区三区不卡| 国产免费一区二区三区四区五区| 亚洲精品资源美女情侣酒店| 日本免费久久| 色狠狠久久av五月综合| 天堂av在线一区| 国产性猛交xx乱| 在线不卡一区二区| 性爱视频在线播放| 精品国产_亚洲人成在线| 一本久道久久久| 91精品小视频| 色综合婷婷久久| 国产福利在线观看| 国产日韩欧美在线观看| 久久久人成影片免费观看| 超碰人人cao| 亚洲成人免费影院| 狠狠色伊人亚洲综合网站l| 国产精品极品尤物在线观看| 久久精品免费一区二区三区| a级大片免费看| 无码av中文一区二区三区桃花岛| 天天摸天天干天天操| 国产精品18久久久久久麻辣| 91亚洲一区| 无码任你躁久久久久久老妇| 色婷婷国产精品| 黄色网页在线看| 精品无码久久久久久久动漫| 视频一区中文字幕| 99久久婷婷国产综合| 日韩av在线网页| 日韩精品一级毛片在线播放| 欧美国产视频一区| 国产日韩欧美a| 亚洲黄色精品视频| 国产精国产精品| 国产精品二区影院| 人人人妻人人澡人人爽欧美一区| 91麻豆精品国产91久久久久久久久| 69av成人| 一区二区在线观| 99国产欧美另类久久久精品| 中文字幕无线码一区| 性欧美xxxx交| 偷拍欧美精品| 日本成人免费视频|