LeetCode--144,94,145,102 二叉树的前序、中序、后序、层序遍历(递归,迭代,栈,队列)

•Tree 专栏收录该内容
3 篇文章 0 订阅

1. 二叉树的前序遍历

1.1 题目描述

难度:中等
在这里插入图片描述

1.2 题目分析

这道题目是二叉树相关问题的基础类问题,利用递归是比较容易想到的方法,但是进阶问题要求用迭代算法来完成,这个需要好好想一下。但是关于二叉树的前序,中序,后序遍历都有一个统一的模板可以套用,我们来看看这个模板是什么:

"""
二叉树遍历模板
采用栈的方法
"""
stack = []
cur = root
while stack or cur:
    if cur:
    	pass
    else:
    	pass

二叉树的前序,中序,后序遍历都可以利用上述的栈的模板实现,只需要根据情况修改代码中的pass段即可。二叉树的前序遍历的顺序是根节点->左子树->右子树。我们来看一下二叉树的前序遍历是怎么实现的。

1.3 Python实现
  • 递归
    先用递归的方法实现一下:
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    def preorderTraversal(self, root: TreeNode) -> List[int]:
        if not root:
            return []
        return [root.val] + self.preorderTraversal(root.left) + self.preorderTraversal(root.right)

运行结果为:
在这里插入图片描述

  • 迭代(栈)
    利用上述模板来实现:
class Solution(object):
    def preorderTraversal(self, root):
        """
        :type root: TreeNode
        :rtype: List[int]
        """
        stack = []
        res = []
        cur = root
        while stack or cur:
            if cur:
                stack.append(cur)
                res.append(cur.val)
                cur = cur.left
            else:
                cur = stack.pop()
                cur = cur.right
        return res

运行结果为:
在这里插入图片描述

2. 二叉树的中序遍历

2.1 题目描述

难度:中等
在这里插入图片描述

2.2 题目分析

中序遍历与前序遍历相似,遍历顺序为左子树->根节点->右子树,实现方式有递归和迭代两种,迭代是利用1.2节中的模板来实现的。

2.3 Python实现
  • 递归实现
class Solution:
    def inorderTraversal(self, root: TreeNode) -> List[int]:
        if not root:
            return []
        return self.inorderTraversal(root.left) + [root.val] + self.inorderTraversal(root.right)

输出结果为:
在这里插入图片描述

  • 迭代实现(栈)
class Solution:
    def inorderTraversal(self, root: TreeNode) -> List[int]:
        stack = []
        res = []
        cur = root
        while stack or cur:
            if cur:
                stack.append(cur)
                cur = cur.left
            else:
                cur = stack.pop()
                res.append(cur.val)
                cur = cur.right
        return res

输出结果为:
在这里插入图片描述

3. 二叉树的后序遍历

2.1 题目描述

难度:困难
在这里插入图片描述

2.2 题目分析

后序遍历的顺序是 左子树->右子树->根节点,后序序遍历与前序、中序遍历相似,实现方式有递归和迭代两种,迭代是利用1.2节中的模板来实现的。

2.3 Python实现
  • 递归实现
class Solution:
    def postorderTraversal(self, root: TreeNode) -> List[int]:
        if not root:
            return []
        return self.postorderTraversal(root.left) + self.postorderTraversal(root.right) + [root.val]

运行结果为:
在这里插入图片描述

  • 迭代实现(栈)
class Solution:
    def postorderTraversal(self, root: TreeNode) -> List[int]:
        stack = []
        res = []
        cur = root
        temp = None
        while stack or cur:
            if cur:
                stack.append(cur)
                cur = cur.left
            else:
                cur = stack[-1]
                if(cur.right is None or cur.right == temp):
                    res.append(cur.val)
                    temp = cur
                    stack.pop()
                    cur = None
                else:
                    cur = cur.right

        return res

运行结果为:
在这里插入图片描述

4. 二叉树的层序遍历

2.1 题目描述

难度:中等
在这里插入图片描述

2.2 题目分析

层序遍历的遍历顺序是:第一层:根节点,第二层:左节点,右节点,第三层…,输出是二维的列表形式。与前三题不同,层序遍历不能依靠栈的结构实现,而要依靠队列进行实现。步骤如下:

  • 将根节点放入队列
  • 将队列中的节点取出,并将其值加入到输出的结果中,并把该节点左右子节点放入队列
  • 以队列的长度为循环次数,依次取出队列的列首值,并将节点的值加入到输出结果中,并同时将节点的左右子节点放入队列
  • 重复第三个步骤,直到队列为空
2.3 Python实现

代码如下:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

# 队列
class Solution:
    def levelOrder(self, root: TreeNode) -> List[List[int]]:
        if not root:
            return []
        res = []
        queue = [root]
        temp = []
        while queue:
            lens = len(queue)
            temp = []
            while lens:
                cur = queue[0]
                del queue[0]
                temp.append(cur.val)
                if cur.left:
                    queue.append(cur.left)
                if cur.right:
                    queue.append(cur.right)
                lens -= 1
            res.append(temp)
        return res

输出结果为:
在这里插入图片描述

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

打赏
文章很值,打赏犒劳作者一下
相关推荐
<p> <span style="font-size:14px;color:#337FE5;">【为什么学爬虫?】</span> </p> <p> <span style="font-size:14px;">       1、爬虫入手容易,但是深入较难,如何写出高效率的爬虫,如何写出灵活性高可扩展的爬虫都是一项技术活。另外在爬虫过程,经常容易遇到被反爬虫,比如字体反爬、IP识别、验证码等,如何层层攻克难点拿到想要的数据,这门课程,你都能学到!</span> </p> <p> <span style="font-size:14px;">       2、如果是作为一个其他行业的开发者,比如app开发,web开发,学习爬虫能让你加强对技术的认知,能够开发出更加安全的软件和网站</span> </p> <p> <br /> </p> <span style="font-size:14px;color:#337FE5;">【课程设计】</span> <p class="ql-long-10663260"> <span> </span> </p> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> 一个完整的爬虫程,无论大小,总体来说可以分成三个步骤,分别是: </p> <ol> <li class="" style="font-size:11pt;color:#494949;"> 网络请求:模拟浏览器的行为从网上抓取数据。 </li> <li class="" style="font-size:11pt;color:#494949;"> 数据解析:将请求下来的数据进行过滤,提取我们想要的数据。 </li> <li class="" style="font-size:11pt;color:#494949;"> 数据存储:将提取到的数据存储到硬盘或者内存。比如用mysql数据库或者redis等。 </li> </ol> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> 那么本课程也是按照这几个步骤循渐进的进行讲解,带领学生完整的掌握每个步骤的技术。另外,因为爬虫的多样性,在爬取的过程可能会发生被反爬、效率低下等。因此我们又增加了两个章节用来提高爬虫程的灵活性,分别是: </p> <ol> <li class="" style="font-size:11pt;color:#494949;"> 爬虫进阶:包括IP代理,多线程爬虫,图形验证码识别、JS加密解密、动态网页爬虫、字体反爬识别等。 </li> <li class="" style="font-size:11pt;color:#494949;"> Scrapy和分布式爬虫:Scrapy框架、Scrapy-redis组件、分布式爬虫等。 </li> </ol> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> 通过爬虫进阶的知识点我们能应付大量的反爬网站,而Scrapy框架作为一个专业的爬虫框架,使用他可以快速提高我们编写爬虫程的效率和速度。另外如果一台机器不能满足你的需求,我们可以用分布式爬虫让多台机器帮助你快速爬取数据。 </p> <p style="font-size:11pt;color:#494949;">   </p> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> 从基础爬虫到商业化应用爬虫,本套课程满足您的所有需求! </p> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> <br /> </p> <p> <br /> </p> <p> <span style="font-size:14px;background-color:#FFFFFF;color:#337FE5;">【课程服务】</span> </p> <p> <span style="font-size:14px;">专属付费社群+定期答疑</span> </p> <p> <br /> </p> <p class="ql-long-24357476"> <span style="font-size:16px;"><br /> </span> </p> <p> <br /> </p> <p class="ql-long-24357476"> <span style="font-size:16px;"></span> </p>
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页

打赏

爱吃骨头的猫、

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值