Go Java算法之二叉樹的所有路徑示例詳解
二叉樹的所有路徑
給你一個(gè)二叉樹的根節(jié)點(diǎn) root ,按 任意順序 ,返回所有從根節(jié)點(diǎn)到葉子節(jié)點(diǎn)的路徑。
葉子節(jié)點(diǎn) 是指沒有子節(jié)點(diǎn)的節(jié)點(diǎn)。
- 示例 1:
輸入:root = [1,2,3,null,5]
輸出:["1->2->5","1->3"]
- 示例 2:
輸入:root = [1]
輸出:["1"]
提示:
樹中節(jié)點(diǎn)的數(shù)目在范圍 [1, 100] 內(nèi)
-100 <= Node.val <= 100
方法一:深度優(yōu)先遍歷搜索(Java)
最直觀的方法是使用深度優(yōu)先搜索。在深度優(yōu)先搜索遍歷二叉樹時(shí),我們需要考慮當(dāng)前的節(jié)點(diǎn)以及它的孩子節(jié)點(diǎn)。
如果當(dāng)前節(jié)點(diǎn)不是葉子節(jié)點(diǎn),則在當(dāng)前的路徑末尾添加該節(jié)點(diǎn),并繼續(xù)遞歸遍歷該節(jié)點(diǎn)的每一個(gè)孩子節(jié)點(diǎn)。
如果當(dāng)前節(jié)點(diǎn)是葉子節(jié)點(diǎn),則在當(dāng)前路徑末尾添加該節(jié)點(diǎn)后我們就得到了一條從根節(jié)點(diǎn)到葉子節(jié)點(diǎn)的路徑,將該路徑加入到答案即可。
遞歸二步曲:
(1) 找出重復(fù)的子問題。
- 前序遍歷的順序是:根節(jié)點(diǎn)、左子樹、右子樹。
- 在本題同樣也是這個(gè)順序:將根節(jié)點(diǎn)加入路徑,遞歸左子樹,遞歸右子樹。
- 對于左子樹和右子樹來說,也都是同樣的操作。
(2) 確定終止條件。
對于二叉樹的所有路徑中的每條路徑,當(dāng)遍歷到葉子節(jié)點(diǎn)的時(shí)候?yàn)楫?dāng)前路徑的結(jié)束。并且將當(dāng)前路徑加入結(jié)果集。
class Solution { public List<String> binaryTreePaths(TreeNode root) { List<String> paths = new ArrayList<String>(); constructPaths(root, "", paths); return paths; } public void constructPaths(TreeNode root, String path, List<String> paths) { if (root != null) { StringBuffer pathSB = new StringBuffer(path); pathSB.append(Integer.toString(root.val)); if (root.left == null && root.right == null) { // 當(dāng)前節(jié)點(diǎn)是葉子節(jié)點(diǎn) paths.add(pathSB.toString()); // 把路徑加入到答案中 } else { pathSB.append("->"); // 當(dāng)前節(jié)點(diǎn)不是葉子節(jié)點(diǎn),繼續(xù)遞歸遍歷 constructPaths(root.left, pathSB.toString(), paths); constructPaths(root.right, pathSB.toString(), paths); } } } }
時(shí)間復(fù)雜度:O(N^2)
空間復(fù)雜度:O(N^2)
方法二:廣度優(yōu)先遍歷(Go)
我們也可以用廣度優(yōu)先搜索來實(shí)現(xiàn)。
- 我們維護(hù)一個(gè)隊(duì)列,存儲(chǔ)節(jié)點(diǎn)以及根到該節(jié)點(diǎn)的路徑。一開始這個(gè)隊(duì)列里只有根節(jié)點(diǎn)。
- 在每一步迭代中,我們?nèi)〕鲫?duì)列中的首節(jié)點(diǎn)
- 如果它是葉子節(jié)點(diǎn),則將它對應(yīng)的路徑加入到答案中。如果它不是葉子節(jié)點(diǎn),則將它的所有孩子節(jié)點(diǎn)加入到隊(duì)列的末尾。
- 當(dāng)隊(duì)列為空時(shí)廣度優(yōu)先搜索結(jié)束
func binaryTreePaths(root *TreeNode) []string { paths := []string{} if root == nil { return paths } nodeQueue := []*TreeNode{} pathQueue := []string{} nodeQueue = append(nodeQueue, root) pathQueue = append(pathQueue, strconv.Itoa(root.Val)) for i := 0; i < len(nodeQueue); i++ { node, path := nodeQueue[i], pathQueue[i] if node.Left == nil && node.Right == nil { paths = append(paths, path) continue } if node.Left != nil { nodeQueue = append(nodeQueue, node.Left) pathQueue = append(pathQueue, path + "->" + strconv.Itoa(node.Left.Val)) } if node.Right != nil { nodeQueue = append(nodeQueue, node.Right) pathQueue = append(pathQueue, path + "->" + strconv.Itoa(node.Right.Val)) } } return paths }
時(shí)間復(fù)雜度:O(N^2)
空間復(fù)雜度:O(N^2)
以上就是Go Java算法之二叉樹的所有路徑示例詳解的詳細(xì)內(nèi)容,更多關(guān)于Go Java算法二叉樹所有路徑的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
go語言實(shí)現(xiàn)并發(fā)網(wǎng)絡(luò)爬蟲的示例代碼
本文主要介紹了go語言實(shí)現(xiàn)并發(fā)網(wǎng)絡(luò)爬蟲的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03Go語言數(shù)據(jù)結(jié)構(gòu)之希爾排序示例詳解
這篇文章主要為大家介紹了Go語言數(shù)據(jù)結(jié)構(gòu)之希爾排序示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08golang監(jiān)聽ip數(shù)據(jù)包的實(shí)現(xiàn)步驟(golang純享版)
這篇文章主要給大家介紹了golang監(jiān)聽ip數(shù)據(jù)包的實(shí)現(xiàn)步驟,本文以ip4 作為案例進(jìn)行包抓取示范,ip6抓取與ip4方式異曲同工,可自行舉一反三得出,文中通過圖文結(jié)合給大家介紹的非常詳細(xì),需要的朋友可以參考下2024-02-02基于Go語言實(shí)現(xiàn)應(yīng)用IP防火墻
在公司里面經(jīng)常會(huì)聽到某應(yīng)用有安全漏洞問題,沒有做安全加固,IP防火墻就是一個(gè)典型的安全加固解決方案,下面我們就來學(xué)習(xí)一下如何使用go語言實(shí)現(xiàn)IP防火墻吧2023-11-11利用GO語言實(shí)現(xiàn)多人聊天室實(shí)例教程
聊天室的實(shí)現(xiàn)大家應(yīng)該都遇到過,這篇文章主要給大家介紹了關(guān)于利用GO語言實(shí)現(xiàn)多人聊天室的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。2018-03-03