leetcode-二叉树的层序遍历python实现

本文介绍了二叉树的层序遍历概念,并提供了使用Python实现二叉树层序遍历的方法,适用于LeetCode中的相关题目。通过迭代法和队列来完成层次遍历,同时讨论了逆序输出层序遍历结果的解法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二叉树是每个节点最多有两个子树的树结构。二叉树的遍历有深度优先遍历(Depth-First-Search,DFS)和广度优先遍历(Breadth-First-Search,BFS)两类。深度优先遍历包括前序遍历、中序遍历、后续遍历;广度优先遍历也就是二叉树层序遍历。访问节点的顺序如下。

前序遍历:根节点,左子节点,右子节点

中序遍历:左子节点,根节点,右子节点

后序遍历:左子节点,右子节点,根节点

层序遍历:从上到下,从左至右依次遍历节点

以下将给出这层序遍历的python实现,分别对应leetcode的以下题目。前序遍历、中序遍历、后续遍历的python实现可查找上一篇博客

二叉树节点类的定义

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

例:二叉树的结构

      1
   /   \
  2    3
 /  \   /  \
14  5  6  10

 

层次遍历为[[1], [2, 3], [14, 5, 6, 10]]

其中关于层序遍历题目要求返回二维数组,第一维存储二叉树的每一行;另外也可以返回[1,2,3,14,5,6,10],看实际的存储要求)

(一). leetcode(102)二叉树的层序遍历
迭代法+队列实现

class Solution(object):
    def levelOrder(self, root):
        """
        :type root: TreeNode
        :rtype: List[List[int]]
        """
        if not root: return [] #注意特殊情况:树为空返回[]
        queue = [root]
        list1 = []
        while queue:
            list2 = []
            for i in range(len(queue)):
                a = queue.pop(0)#元素出队列
                if a.left:
                    queue.append(a.left)
                if a.right:
                    queue.append(a.right)
                list2.append(a.val)
            list1.append(list2)
        return list1

测试

if __name__ == "__main__":
    nodelist=[TreeNode(i)for i in [1,2,3,14,5,6,10]]
    nodelist[0].left=nodelist[1]
    nodelist[0].right=nodelist[2]
    nodelist[1].left=nodelist[3]
    nodelist[1].right=nodelist[4]
    nodelist[2].left=nodelist[5]
    nodelist[2].right=nodelist[6]

    Tree=nodelist[0]
    s=Solution()
    m=s.levelOrder(Tree)
    print("二叉树的层次遍历为%s"%(m))
#result:
二叉树的层次遍历为[[1], [2, 3], [14, 5, 6, 10]]

(二). leetcode(107)二叉树的层序遍历 II 

本题要求逆序输出层序遍历的结果,因此只需和上题相似,最后返回时进行逆序即可

class Solution:
    def levelOrderBottom(self, root: TreeNode) -> List[List[int]]:
        if not root: return [] #注意特殊情况:树为空返回[]
        queue = [root]
        list1 = []
        while queue:
            list2 = []
            for i in range(len(queue)):
                a = queue.pop(0)#元素出队列
                if a.left:
                    queue.append(a.left)
                if a.right:
                    queue.append(a.right)
                list2.append(a.val)
            list1.append(list2)
        return list1[::-1]#返回时进行逆序

测试

if __name__ == "__main__":
    nodelist=[TreeNode(i)for i in [1,2,3,14,5,6,10]]
    nodelist[0].left=nodelist[1]
    nodelist[0].right=nodelist[2]
    nodelist[1].left=nodelist[3]
    nodelist[1].right=nodelist[4]
    nodelist[2].left=nodelist[5]
    nodelist[2].right=nodelist[6]

    Tree=nodelist[0]
    s=Solution()
    m=s.levelOrder(Tree)
    print("二叉树的层次遍历逆序为%s"%(m))
#result:
二叉树的层次遍历逆序为[[14, 5, 6, 10], [2, 3], [1]]

欢迎关注公众号:算法学习总结,获取更多知识,共同交流学习

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值