最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go Java算法之二叉樹的所有路徑示例詳解

 更新時(shí)間:2022年08月18日 09:16:02   作者:黃丫丫  
這篇文章主要為大家介紹了Go Java算法之二叉樹的所有路徑示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

二叉樹的所有路徑

給你一個(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)加入路徑,遞歸左子樹,遞歸右子樹。
  • 對(duì)于左子樹和右子樹來說,也都是同樣的操作。

(2) 確定終止條件。

對(duì)于二叉樹的所有路徑中的每條路徑,當(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),則將它對(duì)應(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算法二叉樹所有路徑的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • golang使用信號(hào)量熱更新的實(shí)現(xiàn)示例

    golang使用信號(hào)量熱更新的實(shí)現(xiàn)示例

    這篇文章主要介紹了golang使用信號(hào)量熱更新的實(shí)現(xiàn)示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-04-04
  • golang中select語句的簡單實(shí)例

    golang中select語句的簡單實(shí)例

    Go的select語句是一種僅能用于channl發(fā)送和接收消息的專用語句,此語句運(yùn)行期間是阻塞的,下面這篇文章主要給大家介紹了關(guān)于golang中select語句的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • Go語言共享內(nèi)存讀寫實(shí)例分析

    Go語言共享內(nèi)存讀寫實(shí)例分析

    這篇文章主要介紹了Go語言共享內(nèi)存讀寫方法,實(shí)例分析了共享內(nèi)存的原理與讀寫技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-02-02
  • Go語言七篇入門教程四通道及Goroutine

    Go語言七篇入門教程四通道及Goroutine

    這篇文章主要為大家介紹了Go語言的通道及Goroutine示例詳解,本文是Go語言七篇入門系列篇,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-11-11
  • Go語言中緩沖bufio的原理解讀與應(yīng)用實(shí)戰(zhàn)

    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中Map類型和Slice類型的傳遞

    詳解Go中Map類型和Slice類型的傳遞

    這篇文章主要為大家詳細(xì)介紹了Go中Map類型和Slice類型的傳遞,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • Go語言基于viper的conf庫進(jìn)行配置文件解析

    Go語言基于viper的conf庫進(jìn)行配置文件解析

    在現(xiàn)代軟件開發(fā)中,配置文件是不可或缺的一部分,如何高效地將這些格式解析到 Go 結(jié)構(gòu)體中,一直是開發(fā)者的痛點(diǎn),下面我們來看看如何使用conf進(jìn)行配置文件解析吧
    2025-03-03
  • 使用go操作redis的有序集合(zset)

    使用go操作redis的有序集合(zset)

    這篇文章主要介紹了使用go操作redis的有序集合(zset),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Go 實(shí)現(xiàn)基于Token 的登錄流程深度分析

    Go 實(shí)現(xiàn)基于Token 的登錄流程深度分析

    Token 認(rèn)證機(jī)制的核心思想是,服務(wù)端在用戶登錄時(shí)生成一個(gè) Token,客戶端在后續(xù)的請(qǐng)求中攜帶這個(gè) Token,服務(wù)端通過驗(yàn)證 Token 的有效性來確認(rèn)用戶的身份,本文將帶你深入探索基于 Token 的登錄流程,這是一種更為靈活且適用于現(xiàn)代應(yīng)用架構(gòu)的認(rèn)證方式
    2024-03-03
  • 淺析golang如何在多線程中避免CPU指令重排

    淺析golang如何在多線程中避免CPU指令重排

    這篇文章主要為大家詳細(xì)介紹了golang在多線程中避免CPU指令重排的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-03-03

最新評(píng)論

开封市| 德州市| 奉节县| 子洲县| 沾化县| 巩留县| 宝山区| 紫云| 桃园市| 西城区| 滦南县| 镇赉县| 莎车县| 临漳县| 于田县| 宕昌县| 克拉玛依市| 万荣县| 丹凤县| 都江堰市| 溧水县| 龙里县| 清丰县| 合肥市| 尉犁县| 福泉市| 东港市| 准格尔旗| 隆林| 仁化县| 沧州市| 娄底市| 沧源| 周口市| 邢台市| 济阳县| 多伦县| 莱州市| 南江县| 集贤县| 金寨县|