Go Java算法之二叉樹的所有路徑示例詳解
二叉樹的所有路徑
給你一個二叉樹的根節(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)先搜索遍歷二叉樹時,我們需要考慮當(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)的每一個孩子節(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)、左子樹、右子樹。
- 在本題同樣也是這個順序:將根節(jié)點(diǎn)加入路徑,遞歸左子樹,遞歸右子樹。
- 對于左子樹和右子樹來說,也都是同樣的操作。
(2) 確定終止條件。
對于二叉樹的所有路徑中的每條路徑,當(dāng)遍歷到葉子節(jié)點(diǎn)的時候?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);
}
}
}
}
時間復(fù)雜度:O(N^2)
空間復(fù)雜度:O(N^2)
方法二:廣度優(yōu)先遍歷(Go)
我們也可以用廣度優(yōu)先搜索來實(shí)現(xiàn)。
- 我們維護(hù)一個隊列,存儲節(jié)點(diǎn)以及根到該節(jié)點(diǎn)的路徑。一開始這個隊列里只有根節(jié)點(diǎn)。
- 在每一步迭代中,我們?nèi)〕鲫犃兄械氖坠?jié)點(diǎn)
- 如果它是葉子節(jié)點(diǎn),則將它對應(yīng)的路徑加入到答案中。如果它不是葉子節(jié)點(diǎn),則將它的所有孩子節(jié)點(diǎn)加入到隊列的末尾。
- 當(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算法之二叉樹的所有路徑示例詳解的詳細(xì)內(nèi)容,更多關(guān)于Go Java算法二叉樹所有路徑的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
golang使用信號量熱更新的實(shí)現(xiàn)示例
這篇文章主要介紹了golang使用信號量熱更新的實(shí)現(xiàn)示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-04-04
Go語言中緩沖bufio的原理解讀與應(yīng)用實(shí)戰(zhàn)
Go語言標(biāo)準(zhǔn)庫中的bufio包提供了帶緩沖的I/O操作,它通過封裝io.Reader和io.Writer接口,減少頻繁的I/O操作,提高讀寫效率,本文就來詳細(xì)的介紹一下,感興趣的可以學(xué)習(xí)2024-10-10
Go語言基于viper的conf庫進(jìn)行配置文件解析
在現(xiàn)代軟件開發(fā)中,配置文件是不可或缺的一部分,如何高效地將這些格式解析到 Go 結(jié)構(gòu)體中,一直是開發(fā)者的痛點(diǎn),下面我們來看看如何使用conf進(jìn)行配置文件解析吧2025-03-03
Go 實(shí)現(xiàn)基于Token 的登錄流程深度分析
Token 認(rèn)證機(jī)制的核心思想是,服務(wù)端在用戶登錄時生成一個 Token,客戶端在后續(xù)的請求中攜帶這個 Token,服務(wù)端通過驗(yàn)證 Token 的有效性來確認(rèn)用戶的身份,本文將帶你深入探索基于 Token 的登錄流程,這是一種更為靈活且適用于現(xiàn)代應(yīng)用架構(gòu)的認(rèn)證方式2024-03-03

