二叉树遍历问题分析
问题描述
给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。
示例:
二叉树:[3,9,20,null,null,15,7]
,
3 / \ 9 20 / \ 15 7
返回其层次遍历结果:
[ [3], [9,20], [15,7] ]
解题思路
二叉树的层序遍历比较基础,想法很简单,就是用一个queue就可以实现,一次把弹出节点的左右子节点放入queue中,然后读出就行。
然而这个题,要求同一层结点数据放在一个[]中,这个地方就是我们要思考的地方!
在队列中添加子节点的同时,要把同一层的结点放在一起操作,这里就需要获得这一层结点的数量,然后在这个数量中再循环看看是否还有子节点,然后继续放入队列中。
代码实现
from queue import Queue
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]]:
results = [] #放最终结果
que = Queue() #暂存队列
if root:
results.append([root.val])
que.put(root)
while not que.empty():
quelength = que.qsize() #获取同层结点的数量,因为同层的结点同时在队列里
cell = [] #存放每层的结点val
for i in range(quelength):
node = que.get()
if node.left:
cell.append(node.left.val)
que.put(node.left)
if node.right:
cell.append(node.right.val)
que.put(node.right)
quelength -= 1
if cell :
results.append(cell)
return results
问题变种
如何求每层的平均值?
给定一个非空二叉树, 返回一个由每层节点平均值组成的数组。
示例 1:
输入: 3 / \ 9 20 / \ 15 7 输出:[3, 14.5, 11] 解释: 第 0 层的平均值是 3 , 第1层是 14.5 , 第2层是 11 。因此返回 [3, 14.5, 11] 。
提示:
- 节点值的范围在32位有符号整数范围内。
class Solution:
def averageOfLevels(self, root: TreeNode) -> List[float]:
results = []
que = Queue()
if root:
results.append(root.val)
que.put(root)
while not que.empty():
quelength = que.qsize()
sum = 0
count = 0
for i in range(quelength):
node = que.get()
if node.left:
sum += node.left.val
que.put(node.left)
count += 1
if node.right:
sum += node.right.val
que.put(node.right)
count += 1
if count!=0:
avg = sum / count
results.append(avg)
return results
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!