DFS做比较直观,dfs中记录当前的节点,上一步选了左侧还是右侧,以及当前遍历了几条边。
class Solution:
def longestZigZag(self, root: Optional[TreeNode]) -> int:
self.res = 0
if not root:return self.res
self.dfs(root.left, 'left', 1)
self.dfs(root.right, 'right', 1)
return self.res
def dfs(self, root, leftorright, dive):
if not root:return
self.res = max(self.res, dive)
if leftorright == 'left':
self.dfs(root.left, 'left', 1)
self.dfs(root.right, 'right', dive+1)
if leftorright == 'right':
self.dfs(root.right, 'right', 1)
self.dfs(root.left, 'left', dive + 1)
当然也可以用循环的方式做。
class Solution:
def longestZigZag(self, root: Optional[TreeNode]) -> int:
if not root:return 0
que = collections.deque()
if root.left:
que.append((root.left,'left',1))
if root.right:
que.append((root.right,'right',1))
self.res = 0
while que:
size = len(que)
for _ in range(size):
curnode, leftorright, dive = que.popleft()
self.res = max(self.res, dive)
if leftorright == 'left':
if curnode.left:
que.append((curnode.left,'left',1))
if curnode.right:
que.append((curnode.right,'right',dive+1))
elif leftorright == 'right':
if curnode.right:
que.append((curnode.right,'right',1))
if curnode.left:
que.append((curnode.left,'left',dive+1))
return self.res