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

貪心算法:我要監控二叉樹!

安全 算法
給定一個二叉樹,我們在樹的節點上安裝攝像頭。節點上的每個攝影頭都可以監視其父對象、自身及其直接子對象。計算監控樹的所有節點所需的最小攝像頭數量。

 [[361051]]

監控二叉樹題目地址 : https://leetcode-cn.com/problems/binary-tree-cameras/

給定一個二叉樹,我們在樹的節點上安裝攝像頭。

節點上的每個攝影頭都可以監視其父對象、自身及其直接子對象。

計算監控樹的所有節點所需的最小攝像頭數量。

示例 1:

 

輸入:[0,0,null,0,0]

輸出:1

解釋:如圖所示,一臺攝像頭足以監控所有節點。

示例 2:

 

輸入:[0,0,null,0,null,0,null,null,0]

輸出:2

解釋:需要至少兩個攝像頭來監視樹的所有節點。上圖顯示了攝像頭放置的有效位置之一。

提示:

  • 給定樹的節點數的范圍是 [1, 1000]。
  • 每個節點的值都是 0。

思路

這道題目首先要想,如何放置,才能讓攝像頭最小的呢?

從題目中示例,其實可以得到啟發,我們發現題目示例中的攝像頭都沒有放在葉子節點上!

這是很重要的一個線索,攝像頭可以覆蓋上中下三層,如果把攝像頭放在葉子節點上,就浪費的一層的覆蓋。

所以把攝像頭放在葉子節點的父節點位置,才能充分利用攝像頭的覆蓋面積。

那么有同學可能問了,為什么不從頭結點開始看起呢,為啥要從葉子節點看呢?

因為頭結點放不放攝像頭也就省下一個攝像頭, 葉子節點放不放攝像頭省下了的攝像頭數量是指數階別的。

所以我們要從下往上看,局部最優:讓葉子節點的父節點安攝像頭,所用攝像頭最少,整體最優:全部攝像頭數量所用最少!

局部最優推出全局最優,找不出反例,那么就按照貪心來!

此時,大體思路就是從低到上,先給葉子節點父節點放個攝像頭,然后隔兩個節點放一個攝像頭,直至到二叉樹頭結點。

此時這道題目還有兩個難點:

  1. 二叉樹的遍歷
  2. 如何隔兩個節點放一個攝像頭

確定遍歷順序

在二叉樹中如何從低向上推導呢?

可以使用后序遍歷也就是左右中的順序,這樣就可以在回溯的過程中從下到上進行推導了。

后序遍歷代碼如下:

  1. int traversal(TreeNode* cur) { 
  2.  
  3.         // 空節點,該節點有覆蓋 
  4.         if (終止條件) return ; 
  5.  
  6.         int left = traversal(cur->left);    // 左 
  7.         int right = traversal(cur->right);  // 右 
  8.  
  9.         邏輯處理                            // 中 
  10.         return ; 
  11.     } 

注意在以上代碼中我們取了左孩子的返回值,右孩子的返回值,即left 和 right, 以后推導中間節點的狀態

如何隔兩個節點放一個攝像頭

此時需要狀態轉移的公式,大家不要和動態的狀態轉移公式混到一起,本題狀態轉移沒有擇優的過程,就是單純的狀態轉移!

來看看這個狀態應該如何轉移,先來看看每個節點可能有幾種狀態:

有如下三種:

  • 該節點無覆蓋
  • 本節點有攝像頭
  • 本節點有覆蓋

我們分別有三個數字來表示:

  • 0:該節點無覆蓋
  • 1:本節點有攝像頭
  • 2:本節點有覆蓋

大家應該找不出第四個節點的狀態了。

一些同學可能會想有沒有第四種狀態:本節點無攝像頭,其實無攝像頭就是 無覆蓋 或者 有覆蓋的狀態,所以一共還是三個狀態。

因為在遍歷樹的過程中,就會遇到空節點,那么問題來了,空節點究竟是哪一種狀態呢?空節點表示無覆蓋?表示有攝像頭?還是有覆蓋呢?

回歸本質,為了讓攝像頭數量最少,我們要盡量讓葉子節點的父節點安裝攝像頭,這樣才能攝像頭的數量最少。

那么空節點不能是無覆蓋的狀態,這樣葉子節點就要放攝像頭了,空節點也不能是有攝像頭的狀態,這樣葉子節點的父節點就沒有必要放攝像頭了,而是可以把攝像頭放在葉子節點的爺爺節點上。

所以空節點的狀態只能是有覆蓋,這樣就可以在葉子節點的父節點放攝像頭了

接下來就是遞推關系。

那么遞歸的終止條件應該是遇到了空節點,此時應該返回2(有覆蓋),原因上面已經解釋過了。

代碼如下:

  1. // 空節點,該節點有覆蓋 
  2. if (cur == NULLreturn 2; 

遞歸的函數,以及終止條件已經確定了,再來看單層邏輯處理。

主要有如下四類情況:

  • 情況1:左右節點都有覆蓋

左孩子有覆蓋,右孩子有覆蓋,那么此時中間節點應該就是無覆蓋的狀態了。

如圖:

 

 


968.監控二叉樹2

 

 

代碼如下:

  1. // 左右節點都有覆蓋 
  2. if (left == 2 && right == 2) return 0; 
  • 情況2:左右節點至少有一個無覆蓋的情況

如果是以下情況,則中間節點(父節點)應該放攝像頭:

  • left == 0 && right == 0 左右節點無覆蓋
  • left == 1 && right == 0 左節點有攝像頭,右節點無覆蓋
  • left == 0 && right == 1 左節點有無覆蓋,右節點攝像頭
  • left == 0 && right == 2 左節點無覆蓋,右節點覆蓋
  • left == 2 && right == 0 左節點覆蓋,右節點無覆蓋

這個不難理解,畢竟有一個孩子沒有覆蓋,父節點就應該放攝像頭。

此時攝像頭的數量要加一,并且return 1,代表中間節點放攝像頭。

代碼如下:

  1. if (left == 0 || right == 0) { 
  2.     result++; 
  3.     return 1; 
  • 情況3:左右節點至少有一個有攝像頭

如果是以下情況,其實就是 左右孩子節點有一個有攝像頭了,那么其父節點就應該是2(覆蓋的狀態)

  • left == 1 && right == 2 左節點有攝像頭,右節點有覆蓋
  • left == 2 && right == 1 左節點有覆蓋,右節點有攝像頭
  • left == 1 && right == 1 左右節點都有攝像頭

代碼如下:

  1. if (left == 1 || right == 1) return 2; 

從這個代碼中,可以看出,如果left == 1, right == 0 怎么辦?其實這種條件在情況2中已經判斷過了,如圖:

 

 


968.監控二叉樹1

 

 

這種情況也是大多數同學容易迷惑的情況。

  • 情況4:頭結點沒有覆蓋

以上都處理完了,遞歸結束之后,可能頭結點 還有一個無覆蓋的情況,如圖:

 

 


968.監控二叉樹3

 

 

所以遞歸結束之后,還要判斷根節點,如果沒有覆蓋,result++,代碼如下:

  1. int minCameraCover(TreeNode* root) { 
  2.     result = 0; 
  3.     if (traversal(root) == 0) { // root 無覆蓋 
  4.         result++; 
  5.     } 
  6.     return result; 

以上四種情況我們分析完了,代碼也差不多了,整體代碼如下:

(以下我的代碼注釋很詳細,為了把情況說清楚,特別把每種情況列出來。)

C++代碼

  1. // 版本一 
  2. class Solution { 
  3. private: 
  4.     int result; 
  5.     int traversal(TreeNode* cur) { 
  6.  
  7.         // 空節點,該節點有覆蓋 
  8.         if (cur == NULLreturn 2; 
  9.  
  10.         int left = traversal(cur->left);    // 左 
  11.         int right = traversal(cur->right);  // 右 
  12.  
  13.         // 情況1 
  14.         // 左右節點都有覆蓋 
  15.         if (left == 2 && right == 2) return 0; 
  16.  
  17.         // 情況2 
  18.         // left == 0 && right == 0 左右節點無覆蓋 
  19.         // left == 1 && right == 0 左節點有攝像頭,右節點無覆蓋 
  20.         // left == 0 && right == 1 左節點有無覆蓋,右節點攝像頭 
  21.         // left == 0 && right == 2 左節點無覆蓋,右節點覆蓋 
  22.         // left == 2 && right == 0 左節點覆蓋,右節點無覆蓋 
  23.         if (left == 0 || right == 0) { 
  24.             result++; 
  25.             return 1; 
  26.         } 
  27.  
  28.         // 情況3 
  29.         // left == 1 && right == 2 左節點有攝像頭,右節點有覆蓋 
  30.         // left == 2 && right == 1 左節點有覆蓋,右節點有攝像頭 
  31.         // left == 1 && right == 1 左右節點都有攝像頭 
  32.         // 其他情況前段代碼均已覆蓋 
  33.         if (left == 1 || right == 1) return 2; 
  34.  
  35.         // 以上代碼我沒有使用else,主要是為了把各個分支條件展現出來,這樣代碼有助于讀者理解 
  36.         // 這個 return -1 邏輯不會走到這里。 
  37.         return -1; 
  38.     } 
  39.  
  40. public
  41.     int minCameraCover(TreeNode* root) { 
  42.         result = 0; 
  43.         // 情況4 
  44.         if (traversal(root) == 0) { // root 無覆蓋 
  45.             result++; 
  46.         } 
  47.         return result; 
  48.     } 
  49. }; 

在以上代碼的基礎上,再進行精簡,代碼如下:

  1. // 版本二 
  2. class Solution { 
  3. private: 
  4.     int result; 
  5.     int traversal(TreeNode* cur) { 
  6.         if (cur == NULLreturn 2; 
  7.         int left = traversal(cur->left);    // 左 
  8.         int right = traversal(cur->right);  // 右 
  9.         if (left == 2 && right == 2) return 0; 
  10.         else if (left == 0 || right == 0) { 
  11.             result++; 
  12.             return 1; 
  13.         } else return 2; 
  14.     } 
  15. public
  16.     int minCameraCover(TreeNode* root) { 
  17.         result = 0; 
  18.         if (traversal(root) == 0) { // root 無覆蓋 
  19.             result++; 
  20.         } 
  21.         return result; 
  22.     } 
  23. }; 

大家可能會驚訝,居然可以這么簡短,其實就是在版本一的基礎上,使用else把一些情況直接覆蓋掉了。

在網上關于這道題解可以搜到很多這種神級別的代碼,但都沒講不清楚,如果直接看代碼的話,指定越看越暈,所以建議大家對著版本一的代碼一步一步來哈,版本二中看不中用!

總結

本題的難點首先是要想到貪心的思路,然后就是遍歷和狀態推導。

在二叉樹上進行狀態推導,其實難度就上了一個臺階了,需要對二叉樹的操作非常嫻熟。

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

 

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

2013-07-15 16:35:55

二叉樹迭代器

2021-09-29 10:19:00

算法平衡二叉樹

2020-04-27 07:05:58

二叉樹左子樹右子樹

2020-09-23 18:25:40

算法二叉樹多叉樹

2021-12-17 14:26:58

二叉樹節點數量

2021-09-15 07:56:32

二叉樹層次遍歷

2021-09-28 06:28:51

二叉樹公共祖先

2009-08-11 13:29:57

C#二叉樹遍歷

2020-12-22 08:56:51

JavaScript數據結構前端

2021-04-19 07:47:42

數據結構二叉樹Tree

2021-04-20 08:37:14

數據結構二叉樹

2021-03-17 08:19:22

二叉樹LeetCode

2021-04-28 20:12:27

數據結構創建

2020-11-02 09:15:47

算法與數據結構

2021-05-06 17:46:30

二叉樹數據結構

2022-10-26 23:58:02

二叉樹數組算法

2023-05-08 15:57:16

二叉樹數據結構

2021-08-27 11:36:44

二叉樹回溯節點

2021-03-22 08:23:29

LeetCode二叉樹節點

2018-03-15 08:31:57

二叉樹存儲結構
點贊
收藏

51CTO技術棧公眾號

51精品秘密在线观看| 欧美色婷婷久久99精品红桃| 亚洲精品免费视频| 波多野结衣成人在线| 日韩久久久久久久久| 伊人春色之综合网| 在线不卡免费欧美| 免费av手机在线观看| 国产高清免费在线播放| 国产精品久久久久久久| 欧美日韩中文在线观看| 久久香蕉综合色| 亚洲综合网av| 亚洲国产裸拍裸体视频在线观看乱了中文| 日韩高清a**址| 996这里只有精品| 欧美人体大胆444www| 国内在线观看一区二区三区| 精品一区二区三区四区在线| 黄色aaaaaa| 日韩欧美精品一区二区三区| 中文字幕在线不卡国产视频| 久久久综合香蕉尹人综合网| 国产内射老熟女aaaa∵| 日韩中文欧美在线| 久久久久久久亚洲精品| 一二三四在线观看视频| 人妖一区二区三区| 精品伦理精品一区| 红桃视频 国产| 91亚洲视频| 欧美性xxxxhd| 亚洲熟妇av日韩熟妇在线| 黄网址在线观看| 中文字幕免费不卡| 日本一区二区在线| 神马久久久久| 99九九99九九九视频精品| 亚洲最大av在线| 午夜激情福利网| 欧美日韩国产一区二区三区不卡| 亚洲国产天堂网精品网站| 国产人妻精品久久久久野外| 精品福利在线| 欧美色精品在线视频| 丝袜老师办公室里做好紧好爽| 国产经典三级在线| 亚洲影院免费观看| 国产91视频一区| 性欧美video高清bbw| 成人黄色网址在线观看| 99精品99久久久久久宅男| 97视频免费在线| 精品一区二区三区免费播放| 国产精品日韩精品| 国产裸体美女永久免费无遮挡| 免费国产自线拍一欧美视频| 91av在线网站| 69国产精品视频免费观看| 性伦欧美刺激片在线观看| 日本精品久久电影| 国产精品男女视频| 天使萌一区二区三区免费观看| 国产成人jvid在线播放| 无码视频一区二区三区| 国产精品成人a在线观看| 中文字幕亚洲综合久久| 国产又粗又猛又爽又黄的视频四季 | 久久久成人的性感天堂| 国产真实乱在线更新| 欧美一区二区三区另类| 亚洲第一页自拍| 日韩免费高清一区二区| 综合亚洲色图| 中国人与牲禽动交精品| 国产激情无码一区二区三区| 欧美在线观看天堂一区二区三区| 欧美日韩国产成人在线| 日韩av电影网| 日本系列欧美系列| 亚洲free嫩bbb| 欧洲成人一区二区三区| 91麻豆.com| 性欧美大战久久久久久久免费观看| av在线电影观看| 亚洲激情自拍偷拍| 国产精品丝袜久久久久久消防器材| 涩涩视频在线| 欧美日韩在线播| 亚洲天堂小视频| 你微笑时很美电视剧整集高清不卡| 一区二区三区视频免费| 午夜三级在线观看| 国产一区导航| 国产在线播放91| 欧美一级做性受免费大片免费| 久久色在线观看| 日韩视频在线观看视频| yes4444视频在线观看| 亚洲欧美偷拍三级| www.浪潮av.com| 综合久草视频| 亚洲欧美第一页| 欧美成人一二三区| 日本成人中文字幕| 国产精品一区二区三区免费 | 91免费观看视频| 中文字幕久精品免| 美女100%一区| 精品99999| 三级在线观看免费大全| 石原莉奈一区二区三区在线观看| a级国产乱理论片在线观看99| 国产在线视频资源| 亚洲一区在线观看网站| 午夜剧场在线免费观看| 国产精品三级| 亚洲石原莉奈一区二区在线观看| 国产一区二区播放| 亚洲成av人片乱码色午夜| 国产91精品高潮白浆喷水| 国产毛片毛片毛片毛片毛片| 国产视频一区二区在线| 日产精品高清视频免费| 丁香花在线电影| 91麻豆精品国产91久久久| 国产小视频自拍| 亚洲美女色禁图| 97久久天天综合色天天综合色hd | 日韩高清成人在线| 日韩高清欧美高清| 久久av高潮av无码av喷吹| 久久狠狠亚洲综合| 亚洲精品欧洲精品| 日韩三级影视| 欧美色综合网站| 在线免费观看日韩av| 一本久道久久综合婷婷鲸鱼| av成人午夜| 尤物视频在线看| 欧美一区二区大片| a级黄色片免费看| 国产麻豆精品视频| 穿情趣内衣被c到高潮视频| 国产精品黄色片| 中文字幕亚洲欧美日韩在线不卡| 丁香六月婷婷综合| 久久久99精品久久| 黄色一级片播放| 日韩一级电影| 欧美自拍视频在线观看| 男生女生差差差的视频在线观看| 午夜精品一区二区三区电影天堂| 国产国语老龄妇女a片| 亚洲私拍自拍| aa成人免费视频| 国产高清中文字幕在线| 亚洲精美色品网站| 亚洲熟女综合色一区二区三区| 久久综合九色欧美综合狠狠| 18岁视频在线观看| 免费看日本一区二区| 国产精品免费一区| 麻豆av在线导航| 欧美一区二区三区思思人| 清纯粉嫩极品夜夜嗨av| 成人一级视频在线观看| 少妇无码av无码专区在线观看| 青青久久av| 国产精品第一页在线| 免费人成在线观看播放视频| 91精品国产综合久久久久久| 国产一级久久久| 97精品久久久午夜一区二区三区| 免费在线激情视频| 欧美超碰在线| 欧美中文在线免费| 91在线网址| 欧美日韩免费在线| 久久精品视频18| 国内外成人在线| 天天人人精品| 欧美在线在线| 日产精品99久久久久久| 青青影院在线观看| 亚洲黄页视频免费观看| 一级特黄免费视频| 亚洲精品一卡二卡| 国产传媒第一页| 精品一区二区三区免费观看| 大陆av在线播放| 精品色999| 国产精品视频入口| 777午夜精品电影免费看| 欧美日韩aaaa| 福利在线观看| 亚洲成人三级在线| 97在线公开视频| 色综合中文字幕| 免费一级片在线观看| 久久九九久久九九| 亚洲精品无码一区二区| 蜜桃av一区二区三区电影| 国产3p露脸普通话对白| 国产精品88久久久久久| 久久精品中文字幕一区二区三区 | 美国黄色小视频| 久久久久久久久久电影| 香蕉久久久久久av成人| 蜜臀久久久99精品久久久久久| 国产真人做爰毛片视频直播| 欧美午夜精彩| 欧美福利一区二区三区| 97视频一区| 91久久久久久久久久久久久| 欧美三级网址| 97视频免费观看| 免费观看国产精品| 欧美久久久一区| 精人妻无码一区二区三区| 亚洲国产精品一区二区www| 国产精品一区二区亚洲| 国产午夜精品一区二区三区视频 | 色天使在线观看| 久久精品主播| 亚洲熟女乱色一区二区三区| 狠狠入ady亚洲精品经典电影| 一区二区视频在线观看| 精品国产91| 欧美日韩在线观看一区二区三区| 国产女人18毛片水真多18精品| 成人在线一区二区| 四虎精品在线观看| 国产精品美女免费| 国产一区二区主播在线| 日本精品视频在线| 免费观看一级欧美片| 欧美一区二区三区免费视| 国产理论在线| 9.1国产丝袜在线观看| √8天堂资源地址中文在线| 欧美激情按摩在线| 岛国片av在线| 韩国精品美女www爽爽爽视频| 福利写真视频网站在线| 国色天香2019中文字幕在线观看| 亚洲小说区图片| 久久综合色88| 亚洲s色大片| 欧美大片顶级少妇| 在线天堂中文字幕| 欧美日韩亚洲天堂| 国产精品免费精品一区| 欧亚洲嫩模精品一区三区| av毛片在线免费观看| 色88888久久久久久影院按摩| 日本免费在线观看视频| 欧美中文一区二区三区| 中文在线字幕免费观| 欧美疯狂性受xxxxx喷水图片| 国产精品九九九九| 日韩精品最新网址| 姝姝窝人体www聚色窝| 亚洲美女动态图120秒| 国产1区2区3区在线| 日韩在线视频国产| 羞羞视频在线观看免费| 国产91精品久久久久久久| 激情开心成人网| 成人激情视频在线播放| 91综合久久爱com| 久久久久资源| 视频在线不卡免费观看| 日本国产中文字幕| 午夜亚洲视频| 加勒比av中文字幕| 成人av在线电影| 国产jk精品白丝av在线观看 | 亚洲欧美日韩一区在线| 尤物网在线观看| 久久久久久久av| 姬川优奈av一区二区在线电影| 91精品综合视频| 特黄特色欧美大片| 中文字幕久久一区| 亚洲一级在线| 日日干日日操日日射| av在线一区二区| 国产一区第一页| 精品成人av一区| 亚洲综合精品国产一区二区三区| 欧美精品一区二区三区蜜桃 | 国产一区二区三区亚洲| 欧美日韩综合精品| 欧美jizzhd精品欧美巨大免费| 国产91xxx| 激情综合色综合久久综合| 一区二区三区免费在线观看视频 | 亚洲免费精彩视频| a视频在线播放| 国产精品99久久久久久www| 麻豆精品在线| 香蕉久久夜色| 午夜一区二区三区不卡视频| 激情成人在线观看| 欧美经典三级视频一区二区三区| 免费在线观看av网址| 欧美日韩一级片在线观看| 香蕉视频免费看| 亚洲精品按摩视频| 含羞草www国产在线视频| 日韩美女毛茸茸| 免费成人蒂法| 国产乱子伦精品无码专区| 欧美精品二区| 亚洲免费黄色网| 亚洲国产精品高清| www欧美在线| 亚洲成年人影院在线| 91cn在线观看| 成人免费自拍视频| jvid福利在线一区二区| 激情综合在线观看| 成人性生交大合| 久久国产一级片| 91精品免费在线| 老司机在线看片网av| 国产精品久久久久久五月尺| 亚洲精品蜜桃乱晃| 男人的天堂狠狠干| 成人深夜视频在线观看| 26uuu成人网| 91精品国产综合久久久久久久久久 | 免费在线观看黄色av| 日韩亚洲欧美在线| 亚洲综合图区| 亚洲一区二区三区久久| 希岛爱理一区二区三区| 五月婷婷之婷婷| 亚洲视频在线一区| 99视频国产精品免费观看a| 久久精品一偷一偷国产| 9999在线精品视频| 大桥未久一区二区| 国产传媒欧美日韩成人| 亚洲视频在线播放免费| 亚洲一区二区三区不卡国产欧美| 国产偷拍一区二区| 九九热这里只有在线精品视| 精品国产欧美| 日本一区午夜艳熟免费| 成人免费观看男女羞羞视频| 国产精品theporn动漫| 亚洲国产精品一区二区三区| 黄色软件视频在线观看| 久久综合久久久| 日韩制服丝袜先锋影音| 成年人看的免费视频| 欧美久久久久久蜜桃| 国产美女av在线| 国产精品免费视频一区二区| 一区二区福利| 成人黄色a级片| 欧美久久久久免费| 波多野结衣在线高清| 久久精品日产第一区二区三区精品版| 久久精品主播| 小泽玛利亚一区二区免费| 欧美成人综合网站| 日产福利视频在线观看| 欧美一区二区在线视频观看| 久色婷婷小香蕉久久| 免费在线一级片| 亚洲免费视频观看| 亚洲国产精选| 奇米影视亚洲色图| 国产午夜亚洲精品理论片色戒 | 国产乱码一区二区三区| 久久精品国产亚洲av高清色欲| 日韩精品日韩在线观看| www.一区| 被灌满精子的波多野结衣| 久久青草国产手机看片福利盒子| 最近中文字幕在线观看| 久久av在线看| 亚洲欧洲美洲国产香蕉| 制服丝袜中文字幕第一页| 亚洲狠狠爱一区二区三区| 国产www.大片在线| 国产另类自拍| 美腿丝袜亚洲三区| 久久狠狠高潮亚洲精品| 日韩一区二区精品视频| av综合网页| 天天干天天操天天做| 午夜精品一区二区三区电影天堂 | 五月婷中文字幕| 国产色综合天天综合网| 一本色道久久综合一区| 日本精品在线免费观看|