力扣二叉树的层次遍历

力扣二叉树的层次遍历

1.要求

二叉树的层次遍历
给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。

例如:
给定二叉树: [3,9,20,null,null,15,7],

在这里插入图片描述
返回其层次遍历结果:

[
  [3],
  [9,20],
  [15,7]
]

2.思想及代码

思想就是BFS层次遍历。就是将节点放入列表中,然后弹出看它是否有子节点,有子节点再把子节点加入列表,再把每个值放入列表中,最终再放入最终的列表res中。
例如 [3,5,4] ,第一次 p=[root] len§不为0, 向下执行 ,中间列表 tmp=[] ,然后根据当前p中的个数执行for循环(这里就是将每层的元素放入tmp列表中),当前只有一个执行一次for 循环,然后执行p.pop(0),然后 p=[],判断是否有子节点有两个子节点5,4 然后p中有两个子节点。tmp.append(3) 执行完后for循环后,res.append( [3] ),res=[[3]]。第二次,p中有两个子节点。会执行两遍将 5,4将入到tmp 中去。最后tmp=[5,4],res=[[3],[5,4]]。大概的过程就是这样。

广度优先搜索的代码
		if root==None:
            return []
        tmp=[root]
        res=[root.val]
        while tmp:
            t=tmp.pop(0)
            if t.left:
                res.append(t.left.val)
                tmp.append(t.left)
            if t.right:
                res.append(t.right.val)
                tmp.append(t.right)
        print(res)
# 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]]:

            res = []
            if not root:
                return res
            p = []
            p.append(root)
            while len(p) != 0:
                tmp = []
                for i in range(len(p)):
                    r = p.pop(0)
                    if r.left:
                        p.append(r.left)
                    if r.right:
                        p.append(r.right)
                    tmp.append(r.val)
                res.append(tmp)
            return res

猜你喜欢

转载自blog.csdn.net/weixin_41781408/article/details/89060666
今日推荐