LeetCode_144. Binary Tree Preorder Traversal_路漫漫远修兮

本文探讨了二叉树的先序遍历算法,包括递归和迭代两种实现方式,详细解析了每种方法的代码逻辑,并对比了不同解决方案的特点。

一、原题目

 

Given a binary tree, return the preorder traversal of its nodes' values.

 
二、题目大意

给定一个棵树,返回先序遍历结果。

 

三、作者代码:

作者一:

#思路一 递归遍历
class Solution:
    def preorderTraversal(self, root: TreeNode) -> List[int]:
        res=[]
        self.dfs(root,res)
        return res
    def dfs(self,root,res):
        if root:#如果根元素存在,就添加
            res.append(root.val)
            self.dfs(root.left,res)#遍历左子树
            self.dfs(root.right,res)#遍历右子树



#思路二 迭代遍历
class Solution:
    def preorderTraversal(self, root: TreeNode) -> List[int]:
        stack,res=[root],[]
        while stack:
            node=stack.pop()
            if node:
                res.append(node.val)
                stack.append(node.right)#为什么是根右左?
                stack.append(node.left)
        return res

#先序遍历的顺序是:根左右 ,这里根右左是因为append()依次在列表的末尾添加元素,#而pop()默认每次返回最后一个元素,如果不改变顺序就相当于队列了(先进先出)

作者原文链接:https://leetcode.com/problems/binary-tree-preorder-traversal/discuss/45290/Python-solutions-(recursively-and-iteratively).

作者二:

class Solution(object):
    def preorderTraversal(self, root):
        res = []
        if not root: return res#树为空    
        frontier = [root]
        while frontier:
            expand = frontier.pop()
            res.append(expand.val)#添加根节点
            for child in [expand.right, expand.left]:#左右孩子是否存在 从右到左
                if child:#存在,加入frontier
                    frontier.append(child)
        return res

 

作者原文链接:https://leetcode.com/problems/binary-tree-preorder-traversal/discuss/164646/Python-DFS-Stack

作者三:

#思路一:
class Solution(object):
    def preorderTraversal(self, root):
        if not root:#考虑特殊情况 一个根节点,或者到达叶子结点
            return []
        elif not root.left and not root.right:
            return [root.val]#返回一个列表
        l = self.preorderTraversal(root.left)
        r = self.preorderTraversal(root.right)
        return [root.val]+l+r#根左右

#思路二:
class Solution(object):
    def preorderTraversal(self, root):
        if not root:#树为空
            return []
        res = []
        stack = [root]
        while stack:
            u = stack.pop()
            res.append(u.val)
            if u.right:#右结点存在 与上面第一个思路有点区别,但是本人理解不了,两者处理的是否有区别?
                stack.append(u.right)
            if u.left:#左结点存在
                stack.append(u.left)
        return res

#思路三:
class Solution(object):
    def preorderTraversal(self, root):
        trav = root
        stack = []
        res = []
        while trav or stack:
            if trav:
                stack.append(trav)
                res.append(trav.val)
                trav = trav.left#左树遍历完
            else:
                u = stack.pop()#弹出一个根结点
                trav = u.right#右树遍历
        return res

作者原文链接:https://leetcode.com/problems/binary-tree-preorder-traversal/discuss/164175/Python-s

四、知识点:

先序遍历的顺序是:根左右 ,列表中根右左是因为append()依次在列表的末尾添加元素,而pop()默认每次返回最后一个元素,如果不改变顺序就相当于队列了(先进先出)

(这个也是做到后面才理解的)

 

五、来源


题目连接:https://leetcode.com/problems/binary-tree-preorder-traversal/


座右铭:站在别人的思想上,看见自己的不足,传播错误的经验,愿君不重蹈覆辙。

 

由于受限于本人经验,难免不足,如有建议,欢迎留言交流。

 

说明:本人对作者的内容进行了简单排版和总结,想看原版,上面有链接,如果喜欢,请点赞,您的鼓励是本人前进的最好动力。本人的这个分类,就是为了汇聚不同思路,为大家学习提供方便,同时为了以后能够全面的理解这里的代码。(现在有些理解不全面,请见谅)


--------------------- 
作者:路漫漫,远修兮 
来源:优快云 
原文:https://blog.youkuaiyun.com/qq_41827968/article/details/88756403 
版权声明:本文为博主原创文章,转载请附上博文链接!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值