两个思路吧,第二个略麻烦。
第一个是一次dfs
class Solution:
def dfs(self, root):
if not root:
return (root, 0)
left_dict = self.dfs(root.left)
right_dict = self.dfs(root.right)
if left_dict[1] == right_dict[1]:
return (root, left_dict[1]+1)
elif left_dict[1] > right_dict[1]:
return (left_dict[0], left_dict[1]+1)
else:
return (right_dict[0], right_dict[1]+1)
def subtreeWithAllDeepest(self, root):
"""
:type root: TreeNode
:rtype: TreeNode
"""
ans_dict = self.dfs(root)
return ans_dict[0]
第二个思路是两次dfs,一次找最深节点,第二次找到答案节点。
class Solution:
def __init__(self):
self.deepest = 0
self.deep_node = []
self.ans_node = None
def dfs(self, root, deep_now):
if not root:
return
if not (root.right or root.left):
if deep_now > self.deepest:
self.deepest = deep_now
self.deep_node = []
self.deep_node.append(root)
return
if deep_now == self.deepest:
self.deep_node.append(root)
return
self.dfs(root.left, deep_now + 1)
self.dfs(root.rignt, deep_now + 1)
return
def dfs_1(self, root):
if root in self.deep_node:
return 1
k1 = 0
k2 = 0
if not root.left:
k1 = self.dfs_1(root.left)
if not root.right:
k2 = self.dfs_1(root.right)
if k1 + k2 == len(self.deep_node) and self.ans_node:
self.ans_node = root
return k1 + k2
def subtreeWithAllDeepest(self, root):
"""
:type root: TreeNode
:rtype: TreeNode
"""
self.dfs(root,0)
self.dfs_1(root)
return self.ans_node