给定一个二叉树的 根节点 root
,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
示例 1:
输入: [1,2,3,null,5,null,4] 输出: [1,3,4]示例 2:
输入: [1,null,3] 输出: [1,3]示例 3:
输入: [] 输出: []
第一次提交的错误思路:我以为只要一直往右走就行,但是一直往右走的那条路径不一定是深度最大的路径。
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution(object):
def rightSideView(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
def nextLevel(root, rightView):
rightView.append(root.val)
if root.right:
nextLevel(root.right, rightView)
elif root.left:
nextLevel(root.left, rightView)
rightView = []
if root:
rightView.append(root.val)
if root.right:
nextLevel(root.right, rightView)
elif root.left:
nextLevel(root.left, rightView)
return rightView
参考题解:
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution(object):
def rightSideView(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
everyLevel_right = dict()
max_depth = -1
queue = deque([(root, 0)])
while queue:
node, depth = queue.popleft()
if node:
max_depth = max(depth, max_depth)
# 按照深度更新结点值,最后更新的就是该层最右侧结点
everyLevel_right[depth] = node.val
if node.left:
queue.append((node.left, depth + 1))
if node.right:
queue.append((node.right, depth + 1))
return everyLevel_right.values()
给你一个二叉树的根节点 root
。设根节点位于二叉树的第 1
层,而根节点的子节点位于第 2
层,依此类推。
请返回层内元素之和 最大 的那几层(可能只有一层)的层号,并返回其中 最小 的那个。
示例 1:
输入:root = [1,7,0,7,-8,null,null] 输出:2 解释: 第 1 层各元素之和为 1, 第 2 层各元素之和为 7 + 0 = 7, 第 3 层各元素之和为 7 + -8 = -1, 所以我们返回第 2 层的层号,它的层内元素之和最大。示例 2:
输入:root = [989,null,10250,98693,-89388,null,null,null,-32127] 输出:2
也是广度搜索,创建一个字典存储层号和对应的和
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution(object):
def maxLevelSum(self, root):
"""
:type root: TreeNode
:rtype: int
"""
levelSum = dict()
queue = deque()
queue.append((root, 1))
while queue:
node, depth = queue.popleft()
if depth not in levelSum: # 不能写成levelSum[depth] is None 因为这个时候键还没有 肯定没有值
levelSum[depth] = node.val
else:
levelSum[depth] += node.val
if node.left:
queue.append((node.left, depth + 1))
if node.right:
queue.append((node.right, depth + 1))
maxLevel = 1
sumList = levelSum.values()
maxSum = sumList[0]
for i in range(len(sumList)):
if maxSum < sumList[i]:
maxSum = sumList[i]
maxLevel = i + 1
return maxLevel