【Leetcode 二叉树系列】144.二叉树的前序遍历 Python3 迭代和递归

本文介绍了如何使用递归和迭代两种方式实现二叉树的前序遍历。首先,详细讲解了递归方法,通过修改原始模板以返回结点值数组。接着,讨论了迭代实现,利用栈模拟递归过程,重点在于处理根、左右子节点的顺序。此外,文章还探讨了邓俊辉教授提出的新思路,即自上而下遍历左孩子链,自下而上添加右孩子链,进一步优化了迭代方法。
摘要由CSDN通过智能技术生成

题目链接:
力扣_144.二叉树的前序遍历

二叉树的前序遍历的方式是根左右的顺序,那么优先选取递归的方式来做,之后再考虑是否可以用迭代的方式来完成

1.递归

一般很顺的递归的前序遍历都是print的方式,不需要考虑保存结点值,就能很快写出很基础的代码:

class Solution:
    def preorderTraversal(self, root: TreeNode) -> List[int]:
        if not root:
            return
        print(root.val)
        self.preorderTraversal(root.left)
        self.preorderTraversal(root.right)

这个是一个很原始的模板,现在题目要求要返回这个树的前序遍历的结点值的数组,那么我们需要用一个数组来保存这个结果,就需要在这个模板上进行对应的修改

怎么修改呢?我们要用一个list来不停的append新的结点值,那么这个方法的入参就需要传入这样的一个list,并且这个方法返回的值也应该是这个list那么我们就应该新写一方法来承载这两个入参,原函数就应该调用这个新的方法,传入root和一个初始化的数组res,然后在新的方法里更新这个res,在原方法里最终返回这个数组,(这个数组传入新函数之后一直在更新,所以不需要用一个返回值来接收,可以直接返回这个变量)

然后应该在新的方法里面去递归遍历并传入更新后的res,把print的那一行改为累加结点值res.append(root.val)以达到保存所有结点值的效果

那么我们现在基本框架就搭建好了:

class Solution:
    def preorderTraversal(self, root: TreeNode) -> List[int]:
        # if not root 这一步在preOrder里面做了
        res = []
        self.preOrder(root, res)

        return res

    def preOrder(self, root, res):
        '''对root的判空其实是在这里做了,所以原方法就不需要对root再一次判空'''
        if not root:
            return res
        res.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值