二叉树级顺序遍历 - 反向
Binary Tree Level Order traversal - reversed
我正在 leetcode 上尝试这个编码问题,但无法调试错误!
已经 3 个小时了,我尝试再次重写逻辑,但我仍然遗漏了一些东西。我还可以添加什么以使其适用于测试用例:
>>>input - [1,2,3,4,null,null,5]
>>>expected output - [[4,5],[2,3],[1]]
尽管此代码适用于给定的测试用例:
>>> input - [3,9,20,null,null,15,7]
>>> output - [[15,7],[9,20],[3]]
这是我的努力:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def levelOrderBottom(self, root: TreeNode) -> List[List[int]]:
queue = []
level = []
result = []
if root is None:
return None
result.append([root.val])
queue.append(root)
while len(queue) > 0:
a = queue[0]
ans = self.traverse_value(a.left, a.right, queue)
if ans is not None:
result.append(ans)
queue.pop(0)
return reversed(result)
def traverse_value(self, r_left, r_right, queue):
if r_left is None and r_right is None: # both l and r are none
return
elif r_left is None and r_right is not None: # right is not none
queue.append(r_right)
return [r_right.val]
elif r_left is not None and r_right is None: # left is not none
queue.append(r_left)
return [r_left.val]
elif r_left is not None and r_right is not None: # both are not none
queue.append(r_left)
queue.append(r_right)
return [r_left.val, r_right.val]
您的代码只能通过函数 traverse_value
创建最多包含两个元素的子列表。这不可能是正确的,因为显然更宽的树将在同一层上有更多的元素。您的算法没有规定将 "cousins" 放在同一个列表中,只有直系兄弟姐妹。
您的 BFS 方法当然是个好主意,但请确保正确区分层,以便您知道何时将值放入 same 列表或 new一个:
result = []
if root is None:
return None
queue = [root]
while len(queue):
# get the values out of the current queue
result.append([a.val for a in queue])
# perform a separate loop for the this layer only
nextlayer = []
for a in queue:
# just extend this new list for the whole layer
if a.left:
nextlayer.append(a.left)
if a.right:
nextlayer.append(a.right)
# finally put that whole layer in the queue
queue = nextlayer
return reversed(result)
对于您的信息,它也可以通过 DFS 解决方案来完成,您只需跟踪您所在的深度,并将其用作解决方案列表中的索引:
level = []
def recur(node, depth):
if not node:
return
if depth >= len(level):
level.append([])
level[depth].append(node.val)
recur(node.left, depth+1)
recur(node.right, depth+1)
recur(root, 0)
level.reverse()
return level
我正在 leetcode 上尝试这个编码问题,但无法调试错误!
已经 3 个小时了,我尝试再次重写逻辑,但我仍然遗漏了一些东西。我还可以添加什么以使其适用于测试用例:
>>>input - [1,2,3,4,null,null,5]
>>>expected output - [[4,5],[2,3],[1]]
尽管此代码适用于给定的测试用例:
>>> input - [3,9,20,null,null,15,7]
>>> output - [[15,7],[9,20],[3]]
这是我的努力:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def levelOrderBottom(self, root: TreeNode) -> List[List[int]]:
queue = []
level = []
result = []
if root is None:
return None
result.append([root.val])
queue.append(root)
while len(queue) > 0:
a = queue[0]
ans = self.traverse_value(a.left, a.right, queue)
if ans is not None:
result.append(ans)
queue.pop(0)
return reversed(result)
def traverse_value(self, r_left, r_right, queue):
if r_left is None and r_right is None: # both l and r are none
return
elif r_left is None and r_right is not None: # right is not none
queue.append(r_right)
return [r_right.val]
elif r_left is not None and r_right is None: # left is not none
queue.append(r_left)
return [r_left.val]
elif r_left is not None and r_right is not None: # both are not none
queue.append(r_left)
queue.append(r_right)
return [r_left.val, r_right.val]
您的代码只能通过函数 traverse_value
创建最多包含两个元素的子列表。这不可能是正确的,因为显然更宽的树将在同一层上有更多的元素。您的算法没有规定将 "cousins" 放在同一个列表中,只有直系兄弟姐妹。
您的 BFS 方法当然是个好主意,但请确保正确区分层,以便您知道何时将值放入 same 列表或 new一个:
result = []
if root is None:
return None
queue = [root]
while len(queue):
# get the values out of the current queue
result.append([a.val for a in queue])
# perform a separate loop for the this layer only
nextlayer = []
for a in queue:
# just extend this new list for the whole layer
if a.left:
nextlayer.append(a.left)
if a.right:
nextlayer.append(a.right)
# finally put that whole layer in the queue
queue = nextlayer
return reversed(result)
对于您的信息,它也可以通过 DFS 解决方案来完成,您只需跟踪您所在的深度,并将其用作解决方案列表中的索引:
level = []
def recur(node, depth):
if not node:
return
if depth >= len(level):
level.append([])
level[depth].append(node.val)
recur(node.left, depth+1)
recur(node.right, depth+1)
recur(root, 0)
level.reverse()
return level