欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

(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官方限流器的用法詳解

    Go官方限流器的用法詳解

    限流器是提升服務(wù)穩(wěn)定性的非常重要的組件,本文主要介紹了Go官方限流器的用法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • go語言實(shí)現(xiàn)并發(fā)網(wǎng)絡(luò)爬蟲的示例代碼

    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-03
  • Go語言數(shù)據(jù)結(jié)構(gòu)之希爾排序示例詳解

    Go語言數(shù)據(jù)結(jié)構(gòu)之希爾排序示例詳解

    這篇文章主要為大家介紹了Go語言數(shù)據(jù)結(jié)構(gòu)之希爾排序示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • Go開發(fā)環(huán)境搭建詳細(xì)介紹

    Go開發(fā)環(huán)境搭建詳細(xì)介紹

    由于目前網(wǎng)上Go的開發(fā)環(huán)境搭建文章很多,有些比較老舊,都是基于 GOPATH的,給新入門的同學(xué)造成困擾。以下為2023 版 Go 開發(fā)環(huán)境搭建,可參照此教程搭建Go開發(fā)環(huán)境,有需要的朋友可以參考閱讀
    2023-04-04
  • golang監(jiān)聽ip數(shù)據(jù)包的實(shí)現(xiàn)步驟(golang純享版)

    golang監(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中控制goroutine數(shù)量的方法

    go中控制goroutine數(shù)量的方法

    這篇文章主要介紹了go中控制goroutine數(shù)量的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • 基于Go語言實(shí)現(xiàn)應(yīng)用IP防火墻

    基于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í)例教程

    利用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
  • golang 設(shè)置web請求狀態(tài)碼操作

    golang 設(shè)置web請求狀態(tài)碼操作

    這篇文章主要介紹了golang 設(shè)置web請求狀態(tài)碼操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Go一站式配置管理工具Viper的使用教程

    Go一站式配置管理工具Viper的使用教程

    Viper是一個(gè)方便Go語言應(yīng)用程序處理配置信息的庫,它可以處理多種格式的配置,這篇文章主要為大家介紹了它的具體使用教程,需要的可以參考下
    2023-08-08

最新評論