解题思路
- DFS(先序、中序、后序遍历)
先序遍历二叉树,用一个depth记录当前深度,大于当前最大深度则替换,最后得到的一定是最深且最左边的。【如果题目要问最深且最右边的,就把替换条件从>换成>=】
第一版:进入的时候depth+1,回溯的时候depth-1
# 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: TreeNode) -> int:
self.depth ,self.max_depth = 0, 0
self.node = root
self.PreorderTraversal(root)
return(self.node.val)
def PreorderTraversal(self, root:TreeNode):
self.depth = self.depth + 1
if self.depth > self.max_depth:
self.max_depth = self.depth
self.node = root
if root.left:
self.PreorderTraversal(root.left)
if root.right:
self.PreorderTraversal(root.right)
self.depth = self.depth - 1
第二版:(尽量少用全局变量)将depth作为参数传入
# 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: TreeNode) -> int:
self.depth ,self.max_depth = 0, 0
self.node = root
self.PreorderTraversal(root,0)
return(self.node.val)
def PreorderTraversal(self, root:TreeNode, depth:int):
depth = depth + 1
if depth > self.max_depth:
self.max_depth = depth
self.node = root
if root.left:
self.PreorderTraversal(root.left,depth)
if root.right:
self.PreorderTraversal(root.right,depth)
- BFS(层序遍历):用一个循环控制逐层出队列和逐层入队列(不像之前只判断队列是否为空,没有层的分界线)。逐层操作时就可以记录该层的第一个元素。
# 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: TreeNode) -> int:
q = deque()
q.append(root)
while(q):
lay_lenth = len(q)
value = q[0].val
for i in range(lay_lenth):
node = q.popleft()
if node.left:
q.append(node.left)
if node.right:
q.append(node.right)
return(value)
全部AC