二叉樹的右視圖,力扣

目錄

題目:

我們直接看題解吧:

快速理解解題思路小建議:

審題目+事例+提示:

解題方法:

解題分析:

解題思路:

代碼實現(DFS):

代碼1:

補充說明:

代碼2:

代碼實現(BFS):


題目地址:

199. 二叉樹的右視圖 - 力扣(LeetCode)

難度:中等

今天刷二叉樹的右視圖,大家有興趣可以點上面鏈接,看看題目要求,試著做一下

題目:

給定一個二叉樹的?根節點?root,想象自己站在它的右側,按照從頂部到底部的順序,返回從右側所能看到的節點值。

我們直接看題解吧:

快速理解解題思路小建議:

可以先簡單看一下解題思路,然后照著代碼看思路,會更容易理解一些。

審題目+事例+提示:

根據題意可知,我們右視圖看到的節點都是每一層的最右邊的節點,而這個節點可能在右子樹,也可能子左子樹

解題方法:

方法1:深度優先(DFS)

方法2:廣度優先(BFS)

解題分析:

我們利用深度優先算法遞歸遍歷二叉樹,按照【根節點->右子樹->左子樹】的順序訪問。

解題思路:

?創建一個list集合res用于存儲右視圖看到的節點(即每層最右邊的節點)

?創建一個臨時遍歷depth,用于記錄遍歷樹的深度

?遞歸函數:

? ? ?首先判斷如果根節點為Null,則直接返回

? ? 接著判斷depth與res.size是否相等,相等則將當前節點加入res

? ?然后depth++,遍歷右子樹、左子樹

代碼實現(DFS):

代碼1:
/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*///DFS深度優先算法
class Solution {//先創建一個list集合存儲數據作為返回List<Integer> res = new ArrayList<Integer>();public List<Integer> rightSideView(TreeNode root) {//傳入根節點root,以及0(即depth初始為0)dfs(root,0);return res;}public void dfs(TreeNode root,int depth){//先判斷,1、根節點是否為null,如果根節點為null則返回,//       2、同時也是遞歸的終止條件,即訪問到葉子結點的下一個的時候為null,則返回if(root == null){return;}//首先先訪問當前結點,再遞歸地訪問右子樹 和 左子樹if(depth == res.size()){//判斷二者是否相等,相等則將當前節點加入集合resres.add(root.val);}//每遞歸一次就說明走到下一層,即深度+1depth++;//先遞歸右子樹,再遞歸左子樹,這樣每一層都能訪問到最右邊的結點dfs(root.right,depth);dfs(root.left,depth);}
}
補充說明:

1、遞歸函數第一部分的判空操作的作用

? ? a.根節點判空條件,即如果根節點為null則返回,
? ? b.作為遞歸的終止條件,即訪問到葉子結點的下一個的時候為null,則返回

2、實際上遍歷完右子樹,回過頭遍歷左子樹的時候,depth實際上是從頭計算的,因為一開始遍歷右子樹時,每一次遞歸depth+1,那么最后回溯時depth相當于depth+1直到根節點

2、為什么depth==res.size時,就將當前節點添加到集合res(還是無法理解可以看看下面代碼2)

以此圖為例

首先遍歷右子樹,depth和res.size初始值均為0,根據代碼自上而下的執行順序,res.size首先+1即添加根節點,接著時depth+1,進入下一層,此時res.size==depth==1,因此添加當前節點,接著depth+1...

遍歷完右子樹后,遍歷左子樹,由于depth從0開始,在同一層時,depth與res.size差1,這樣就可以更新新的節點(即depth!=res.size時說明這一層已經有值在res了),同時又能保證每一層只會取到一個節點,(此外由于遍歷順序為根右左,因此保證了每層最先遍歷的時最右邊的節點)

代碼2:

這個的跟上面區別在于用了兩個變量,一個變量maxDepth記錄已探索到的最大深度,和當前的深度depth,只有depth>maxDepth才往list里面add即可。這種可能更好理解一點

 class Solution {//0ms 100% On O1int maxHigh = 0;List<Integer> res = new ArrayList<Integer>();public List<Integer> rightSideView(TreeNode root) {dfs(root,1);return res;}public void dfs(TreeNode root,int high){if(root == null) return;if(maxHigh < high){res.add(root.val);maxHigh = high;}dfs(root.right,high+1);dfs(root.left,high+1);}
}

代碼實現(BFS):

這里BFS實際上是層次遍歷,然后將每層的最后一個節點加入集合

還有就是創建了一個隊列queue用于存儲每層遍歷的節點

層次遍歷-->二叉樹的層序遍歷,力扣-CSDN博客

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public List<Integer> rightSideView(TreeNode root) {List<Integer> res = new ArrayList<>();if (root == null) {return res;}Queue<TreeNode> queue = new LinkedList<>();queue.offer(root);while (!queue.isEmpty()) {int size = queue.size();for (int i = 0; i < size; i++) {TreeNode node = queue.poll();if (node.left != null) {queue.offer(node.left);}if (node.right != null) {queue.offer(node.right);}if (i == size - 1) {  //將當前層的最后一個節點放入結果列表res.add(node.val);}}}return res;}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/716635.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/716635.shtml
英文地址,請注明出處:http://en.pswp.cn/news/716635.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Vue.js中的$nextTick

其實目前在我現有的開發經歷中&#xff0c;我還沒有實際運用過$nextTick&#xff0c;今天在看書時&#xff0c;學習到了這個東西&#xff0c;所以做個筆記記錄一下。 一、$nextTick是什么&#xff1f; $nextTick 是 Vue提供的一個方法&#xff0c;用于在 DOM 更新之后執行回調…

AI:148-開發一種智能語音助手,能夠理解和執行復雜任務

??點擊這里跳轉到本專欄,可查閱專欄頂置最新的指南寶典~ ?????? 你的技術旅程將在這里啟航! 從基礎到實踐,深入學習。無論你是初學者還是經驗豐富的老手,對于本專欄案例和項目實踐都有參考學習意義。 ??? 每一個案例都附帶關鍵代碼,詳細講解供大家學習,希望…

淺談鉤子方法

何為鉤子方法 鉤子方法&#xff08;Hook methods&#xff09;是一種在面向對象編程中常用的設計模式&#xff0c;也被稱為模板方法模式。在這種模式中&#xff0c;父類定義了一個算法的框架&#xff0c;并且將一些步驟的實現延遲到子類中。子類可以通過重寫這些“鉤子方法”來改…

[技巧]Arcgis之圖斑四至點批量計算

前言 上一篇介紹了arcgis之圖斑四至范圍計算&#xff0c;這里介紹的圖斑四至點的計算及獲取&#xff0c;兩者之間還是有差異的。 [技巧]Arcgis之圖斑四至范圍計算 這里說的四至點指的是圖斑最東、最西、最南、最北的四個地理位置點坐標&#xff0c;如下圖&#xff1a; 四至點…

青山隱隱,敗葉蕭蕭

給定序列需滿足二個條件:本身是質數&#xff0c;相鄰二項之和仍為質數 首先一個偶數2*n不能通過2*k&#xff08;k取整數&#xff09;得到質數。 奇數2*n-12*k2*(nk)-1&#xff0c;可能得到質數 那么若序列中存在偶數&#xff0c;一定不滿足第一個條件&#xff08;特判0,2&am…

STM32進階筆記——復位、時鐘與滴答定時器

本專欄爭取每周三更新直到更新完成&#xff0c;期待大家的訂閱關注&#xff0c;歡迎互相學習交流。 目錄 一、復位1.1 軟件復位1.2 低功耗管理復位 二、時鐘2.1 系統時鐘(SYSCLK)選擇2.2 系統時鐘初始化 三、滴答定時器&#xff08;Systick&#xff09;3.1 SysTick部分寄存器3.…

部署bpmn項目實現activiti流程圖的在線繪制

本教程基于centos7.6環境中完成 github開源項目: https://github.com/Yiuman/bpmn-vue-activiti軟件&#xff1a;git、docker 1. 下載源代碼 git clone https://github.com/Yiuman/bpmn-vue-activiti.git2. 修改Dockerfile文件 聲明基礎鏡像&#xff0c;將項目打包&#xff…

EasyRecovery數據恢復軟件有什么優勢呢?

EasyRecovery數據恢復軟件具有以下優勢&#xff1a; 強大的恢復能力&#xff1a;EasyRecovery采用先進的掃描和恢復技術&#xff0c;能夠深度掃描存儲設備&#xff0c;尋找并恢復因各種原因丟失的數據。無論是誤刪除、格式化、分區損壞還是病毒感染&#xff0c;它都能提供有效…

設計模式(十一)策略模式

請直接看原文:設計模式&#xff08;十一&#xff09;策略模式_某移動支付系統在實現賬戶資金轉入和轉出時需要進行身份驗證,該系統為用戶提供了-CSDN博客 ----------------------------------------------------------------------------------------------------------------…

LeetCode01 - 35.搜索插入位置

一、題目要求 給定一個排序數組和一個目標值&#xff0c;在數組中找到目標值&#xff0c;并返回其索引。如果目標值不存在于數組中&#xff0c;返回它將會被按順序插入的位置。 請必須使用時間復雜度為 O(log n) 的算法 示例 1: 輸入: nums [1,3,5,6], target 5 輸出: 2示…

SpringMVC 學習(十一)之數據校驗

目錄 1 數據校驗介紹 2 普通校驗 3 分組校驗 4 參考文檔 1 數據校驗介紹 在實際的項目中&#xff0c;一般會有兩種校驗數據的方式&#xff1a;客戶端校驗和服務端校驗 客戶端校驗&#xff1a;這種校驗一般是在前端頁面使用 JS 代碼進行校驗&#xff0c;主要是驗證輸入數據…

文物預防性保護系統方案的需求分析

沒有文物保存環境監測&#xff0c;就不能實施有效的文物預防性保護。因此要建立文物預防性保護體系&#xff0c;一定要先有良好的文物狀態監測制度,進而進行科學有效的文物保護管理。所以,導入文物預防性保護監測與調控系統,首先就是要針對文物進行全年溫度、濕度、光照等關鍵參…

使用Zint庫生成一維碼/條形碼

下面代碼是是使用 Zint 庫生成 Code 128 類型的條形碼&#xff0c;并將生成的條形碼保存為 output.bmp 文件。下面是對代碼的詳細解釋&#xff1a; #include 和 #include <zint.h>&#xff1a;這兩行代碼包含了所需的頭文件&#xff0c;分別是標準輸入輸出流的頭文件和 Z…

LeetCode---【鏈表的操作】

目錄 206反轉鏈表【鏈表結構基礎】21合并兩個有序鏈表【遞歸】我的答案【錯誤】自己修改【超出時間限制】在官方那里學到的【然后自己復寫,錯誤】對照官方【自己修改】 160相交鏈表【未理解題目目的】在b站up那里學到的【然后自己復寫,錯誤】【超出時間限制】對照官方【自己修改…

(C語言)qsort函數模擬實現

前言 我們需先了解qsort函數 qsort函數詳解&#xff1a;http://t.csdnimg.cn/rTNv9 qsort函數可以排序多種數據類型&#xff0c;很是神奇&#xff0c;這是為什么&#xff0c;我們在里模擬實現這樣的功能 目錄 1. qsort函數模擬實現 2. 我們使用bubble_sort函數排序整形數…

探究前端的.less樣式文件 css的增強版

前言 .less 文件是一種層疊樣式表&#xff08;CSS&#xff09;預處理器語言的文件格式&#xff0c;簡稱 LESS&#xff08;Leaner Style Sheets&#xff09;。它擴展了 CSS 語言&#xff0c;增加了變量、混合、函數和許多其他技術&#xff0c;使得 CSS 更加易于維護和擴展。 與…

AntDesignVue之a-table中key不唯一問題處理的多種方式

AntDesignVue2之a-table中key不唯一問題處理的多種方式 文章目錄 AntDesignVue2之a-table中key不唯一問題處理的多種方式1. key不唯一問題1. 問題描述2. 解決方法1. 帶冒號的rowKey2 . 帶冒號的rowKey綁定表達式3. 不帶冒號的rowKey屬性 1. key不唯一問題 1. 問題描述 antdv: …

Sunshine v0.21.0 安裝卡住,閃退的問題解決

上期博客講了如何利用 Sunshine 和 Moonlight 實現 iPad 當作 Windows 副屏&#xff0c;用官方 Windows installer 安裝 Sunshine 過程中&#xff0c;遇到了安裝卡住&#xff08;這個是因為需要國外網絡環境&#xff09;&#xff0c;安裝后運行閃退的問題。 Sunshine 下載地址…

OpenCV 4基礎篇| OpenCV圖像的裁切

目錄 1. Numpy切片1.1 注意事項1.2 代碼示例 2. cv2.selectROI()2.1 語法結構2.2 注意事項2.3 代碼示例 3. Pillow.crop3.1 語法結構3.2 注意事項3.3 代碼示例 4. 擴展示例&#xff1a;單張大圖裁切成多張小圖5. 總結 1. Numpy切片 語法結構&#xff1a; retval img[y:yh, x…

以目標檢測和分類任務為例理解One-Hot Code

在目標檢測和分類任務中&#xff0c;每一個類別都需要一個編碼來表示&#xff0c;同時&#xff0c;這個編碼會用來計算網絡的loss。比如有貓&#xff0c;狗&#xff0c;豬三種動物&#xff0c;這三種動物相互獨立&#xff0c;在分類中&#xff0c;將其中任意一種分類為其他都同…