日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

深度优先遍历算法-03二叉树路径遍历问题

發布時間:2024/4/11 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深度优先遍历算法-03二叉树路径遍历问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

二叉樹路徑遍歷

  • 簡述
    • 比較基礎的一個DFS的題目,但是確實很多難題的模板。LeetCode很多二叉樹的題本質上就是這個路徑遍歷。
    • 本題為了輸出路徑,使用DFS的經典結構棧完成。
  • 問題描述
    • 給定一個二叉樹結構(通過類定義節點及父子關系),輸出所有到達葉子節點的路徑。(二叉樹只是標準二叉樹)
  • 問題分析
    • 明顯的遍歷題,那么是何種遍歷呢?顯然,優先的是到達葉子節點而不是輻射更大的范圍,這是一個深度優先遍歷,遍歷完了一個方向找不到路了,則回頭遍歷其他路徑。
    • 假設對上圖的二叉樹路徑遍歷。
      • 我們利用一個stack,里面存放一個Node對象和到這個節點為止的路徑(不包括這個節點自己的值)。同時用一個列表res記錄所有的路徑。
      • 只要棧內還有元素就一直遍歷。
        • 每次得到棧頂元素并將其出棧,得到這個Node對象及其路徑字符串ls。
          • 若該節點的左右孩子均不存在,這個節點是一個葉子節點。那么將之前的路徑加上當前節點的值,作為結果添加到結果集res中。
          • 若該節點的左孩子存在,那么其必然不是孩子節點,將左孩子及加上當前節點值的路徑ls入棧。
          • 若該節點的右孩子存在,同上。
      • 當??諘r退出循環,此時res存著所有路徑。
  • 代碼
    • # -*-coding:utf-8-*-class Node(object):def __init__(self, x, y, z):self.val = xself.left = yself.right = zdef search(root):if not root:return []res, stack = [], [(root, "")]while stack:node, ls = stack.pop()if not node.left and not node.right:res.append(ls + str(node.val))if node.left:stack.append((node.left, ls + str(node.val) + "--->"))if node.right:stack.append((node.right, ls + str(node.val) + "--->"))return resif __name__ == '__main__':d = Node(0, None, None)e = Node(1, None, None)f = Node(1, None, None)b = Node(1, None, d)c = Node(1, e, f)a = Node(0, b, c)print(search(a))
  • 運行結果
  • 補充說明
    • 具體代碼可以查看我的Github,歡迎Star或者Fork
    • 參考書《你也能看得懂的Python算法書》

總結

以上是生活随笔為你收集整理的深度优先遍历算法-03二叉树路径遍历问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。