Go Java算法之二叉樹的所有路徑示例詳解
二叉樹的所有路徑
給你一個二叉樹的根節(jié)點 root ,按 任意順序 ,返回所有從根節(jié)點到葉子節(jié)點的路徑。
葉子節(jié)點 是指沒有子節(jié)點的節(jié)點。
- 示例 1:
輸入:root = [1,2,3,null,5]
輸出:["1->2->5","1->3"]
- 示例 2:
輸入:root = [1]
輸出:["1"]
提示:
樹中節(jié)點的數(shù)目在范圍 [1, 100] 內(nèi)
-100 <= Node.val <= 100
方法一:深度優(yōu)先遍歷搜索(Java)
最直觀的方法是使用深度優(yōu)先搜索。在深度優(yōu)先搜索遍歷二叉樹時,我們需要考慮當(dāng)前的節(jié)點以及它的孩子節(jié)點。
如果當(dāng)前節(jié)點不是葉子節(jié)點,則在當(dāng)前的路徑末尾添加該節(jié)點,并繼續(xù)遞歸遍歷該節(jié)點的每一個孩子節(jié)點。
如果當(dāng)前節(jié)點是葉子節(jié)點,則在當(dāng)前路徑末尾添加該節(jié)點后我們就得到了一條從根節(jié)點到葉子節(jié)點的路徑,將該路徑加入到答案即可。
遞歸二步曲:
(1) 找出重復(fù)的子問題。
- 前序遍歷的順序是:根節(jié)點、左子樹、右子樹。
- 在本題同樣也是這個順序:將根節(jié)點加入路徑,遞歸左子樹,遞歸右子樹。
- 對于左子樹和右子樹來說,也都是同樣的操作。
(2) 確定終止條件。
對于二叉樹的所有路徑中的每條路徑,當(dāng)遍歷到葉子節(jié)點的時候為當(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é)點是葉子節(jié)點 paths.add(pathSB.toString()); // 把路徑加入到答案中 } else { pathSB.append("->"); // 當(dāng)前節(jié)點不是葉子節(jié)點,繼續(xù)遞歸遍歷 constructPaths(root.left, pathSB.toString(), paths); constructPaths(root.right, pathSB.toString(), paths); } } } }
時間復(fù)雜度:O(N^2)
空間復(fù)雜度:O(N^2)
方法二:廣度優(yōu)先遍歷(Go)
我們也可以用廣度優(yōu)先搜索來實現(xiàn)。
- 我們維護一個隊列,存儲節(jié)點以及根到該節(jié)點的路徑。一開始這個隊列里只有根節(jié)點。
- 在每一步迭代中,我們?nèi)〕鲫犃兄械氖坠?jié)點
- 如果它是葉子節(jié)點,則將它對應(yīng)的路徑加入到答案中。如果它不是葉子節(jié)點,則將它的所有孩子節(jié)點加入到隊列的末尾。
- 當(dāng)隊列為空時廣度優(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 }
時間復(fù)雜度:O(N^2)
空間復(fù)雜度:O(N^2)
以上就是Go Java算法之二叉樹的所有路徑示例詳解的詳細內(nèi)容,更多關(guān)于Go Java算法二叉樹所有路徑的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
go語言實現(xiàn)并發(fā)網(wǎng)絡(luò)爬蟲的示例代碼
本文主要介紹了go語言實現(xiàn)并發(fā)網(wǎng)絡(luò)爬蟲的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03Go語言數(shù)據(jù)結(jié)構(gòu)之希爾排序示例詳解
這篇文章主要為大家介紹了Go語言數(shù)據(jù)結(jié)構(gòu)之希爾排序示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-08-08golang監(jiān)聽ip數(shù)據(jù)包的實現(xiàn)步驟(golang純享版)
這篇文章主要給大家介紹了golang監(jiān)聽ip數(shù)據(jù)包的實現(xiàn)步驟,本文以ip4 作為案例進行包抓取示范,ip6抓取與ip4方式異曲同工,可自行舉一反三得出,文中通過圖文結(jié)合給大家介紹的非常詳細,需要的朋友可以參考下2024-02-02