二叉树 层序

相关阅读:https://programmercarl.com/0102.%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E5%B1%82%E5%BA%8F%E9%81%8D%E5%8E%86.html#_102-%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E5%B1%82%E5%BA%8F%E9%81%8D%E5%8E%86

层序遍历即二叉树的广度优先遍历,使用队列先进先出的特性。

#层序遍历
from collections import deque 

def levelOrder(node) :
    if not node:
        return []
    
    queue = deque([node]) 
    res = []
    while queue:
        j = 0 
        level = []
        print('current length', len(queue) )
        print('current level', level)
        for i in range(len(queue)):
            cur = queue.popleft() 
            level.append(cur.val) 
            if cur.left:
                queue.append(cur.left) 
            if cur.right:
                queue.append(cur.right) 
            print('after pop length', len(queue) )
            #print(queue) 
            print('after pop level',level) 
            print(res)
            print('this is %d for loop' % i) 
        res.append(level) 
        print('this is %d while loop' % j) 
        j += 1  
        
    return res

leetcode 107:

from collections import deque
def levelOrderBottom(root):
    if not root:
        return []
    #队列
    queue = deque([root])
    #存放所有节点
    res = []
    while queue:
        #存放每一层的节点
        level = []
        for _ in range(len(queue)):
            cur = queue.popleft()
            level.append(cur.val) 
            if cur.left:
                queue.append(cur.left) 
            if cur.right:
                queue.append(cur.right)
        res.append(level)   
    return res[::-1]
                
        

 

初始队列中的元素是3,弹出时队列剩下的只有[9, 20]分别是节点3的左右子节点。此时队列长度为2,开始下一轮for 循环。

弹出节点9,没有左右子节点。继续弹出节点20,此时队列中没有元素并开始append 节点20的左右节点15, 7。

199:

from collections import deque
def rightSideView(root):
    if not root:
        return []
    queue=deque()
    res = []
    while queue:
        #记录每一层的长度
        level_size = len(queue) 
        for i in range(level_size) 
            cur = queue.popleft()
            if i == level_szie-1:
                res.append(cur.val)
            if cur.left:
                queue.append(cur.left) 
            if cur.right:
                queue.append(cur.right) 
    return res
                

因为每一层的长度等价于 len(queue) 所以找出每一层最后一个元素即可。开始想错了,遍历完输出一个二维数组,找到每个二维数组中的一维数组的最后一个,添加到结果列表中。

637

def averageOfLevels(root):
    queue = deque()
    res = []
    while queue:
        level_sum = 0 
        size = len(queue)
        for _ in range(size):
            cur = queue.popleft() 
            level_sum += cur.val 
            
            if cur.left :
                queue.append(cur.left)
                
            if cur.right:
                queue.append(cur.right) 
        res.append(level_sum) 
    return res 

思路是一样的,就是利用queue遍历每一层的特点。 

posted @   大蟒蛇进动吐痰  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示