#递归
class Solution:
def rightSideView(self, root: Optional[TreeNode]) -> List[int]:
result = []
def traversal(root: TreeNode, depth=0):
if not root: return []
if len(result) == depth: result.append([])
result[depth].append(root.val)
if root.left: traversal(root.left, depth + 1)
if root.right: traversal(root.right, depth + 1)
traversal(root,0)
res = []
for i in result:
res.append(i[-1])
return res
思路:
本题就是考察二叉树的层序遍历而已,没什么难的。
注意不要看到是右视图,就忽略遍历左孩子if root.left: traversal(root.left, depth + 1)。
当一个根节点没有右孩子时,左孩子也能被看到。比如[1,2]
#迭代
class Solution:
def rightSideView(self, root: Optional[TreeNode]) -> List[int]:
if not root: return []
results = []
que = deque([root])
while que:
child_size = len(que)
result = []
for _ in range(child_size):
cur = que.popleft()
result.append(cur.val)
if cur.left: que.append(cur.left)
if cur.right: que.append(cur.right)
results.append(result)
res = []
for i in results:
res.append(i[-1])
return res
迭代法层序遍历二叉树
#递归法2
class Solution:
def rightSideView(self, root: TreeNode) -> List[int]:
if not root: return []
result = []
queue = deque([root])
while queue:
child_size = len(queue)
cur = queue[-1]
result.append(cur.val)
for _ in range(child_size):
cur = queue.popleft()
if cur.left: queue.append(cur.left)
if cur.right: queue.append(cur.right)
return result
递归法2:
while循环体里做两件事:
1.只把每层最右侧节点值添加到result:
cur = queue[-1]
result.append(cur.val)
2.在for循环体里,依次将每个节点的左右孩子(下一层节点)加入到queue,待下一轮while用;
优点:
如此,无需遍历每层非最右侧的子节点的值,节约了时间复杂度。