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

二叉树路径遍历

  • 简述
    • 比较基础的一个DFS的题目,但是确实很多难题的模板。LeetCode很多二叉树的题本质上就是这个路径遍历。
    • 本题为了输出路径,使用DFS的经典结构栈完成。
  • 问题描述
    • 给定一个二叉树结构(通过类定义节点及父子关系),输出所有到达叶子节点的路径。(二叉树只是标准二叉树)
  • 问题分析
    • 明显的遍历题,那么是何种遍历呢?显然,优先的是到达叶子节点而不是辐射更大的范围,这是一个深度优先遍历,遍历完了一个方向找不到路了,则回头遍历其他路径。
    • 假设对上图的二叉树路径遍历。
      • 我们利用一个stack,里面存放一个Node对象和到这个节点为止的路径(不包括这个节点自己的值)。同时用一个列表res记录所有的路径。
      • 只要栈内还有元素就一直遍历。
        • 每次得到栈顶元素并将其出栈,得到这个Node对象及其路径字符串ls。
          • 若该节点的左右孩子均不存在,这个节点是一个叶子节点。那么将之前的路径加上当前节点的值,作为结果添加到结果集res中。
          • 若该节点的左孩子存在,那么其必然不是孩子节点,将左孩子及加上当前节点值的路径ls入栈。
          • 若该节点的右孩子存在,同上。
      • 当栈空时退出循环,此时res存着所有路径。
  • 代码
    •   # -*-coding:utf-8-*-
        
        
        class Node(object):
            def __init__(self, x, y, z):
                self.val = x
                self.left = y
                self.right = z
        
        
        def 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 res
        
        
        if __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算法书》
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

周先森爱吃素

你的鼓励是我坚持创作的不懈动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值