题目
思路
这题最直观的方法就是用层序遍历,记录一下每一层的左边第一个节点,这样整个层序遍历一遍就能找到最后一行最左边的节点。这里要注意最左边的节点不一定是父节点的左子节点!!!如果最后一行没有左子节点,那就只能找第一个右子节点了。理解这点非常重要!
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def findBottomLeftValue(self, root: Optional[TreeNode]) -> int:
q = deque([root])
res = root.val
while q:
count = len(q)
for i in range(count):
now = q.popleft()
if now.left:
q.append(now.left)
if now.right:
q.append(now.right)
if i==0:
res = now.val
return res
递归法需要找到最大深度的节点对应的左孩子值(如果没有就找右孩子值)。其实用前中后序遍历都可以,但是要保证递归左子树一定在递归右子树前面,这样才能得到每一层的最左边节点了,如果调换一下顺序,找到的应该是最后一层最右边的节点。
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def __init__(self):
self.maxdepth = -1
self.res = None
def solve(self,root,deepth):
if not root:
return
if not root.left and not root.right and deepth>self.maxdepth:
self.maxdepth = deepth
self.res = root.val
return
self.solve(root.left,deepth+1)
self.solve(root.right,deepth+1)
def findBottomLeftValue(self, root: Optional[TreeNode]) -> int:
self.solve(root,0)
return self.res
实际上,这题用层序遍历非常的高效,而且容易理解,非常推荐!