Given a binary tree, imagine yourself standing on the right side of it, return the values of the nodes you can see ordered from top to bottom.
For example:
Given the following binary tree,
1 <--- / \ 2 3 <--- \ \ 5 4 <---
You should return [1, 3, 4]
.
根据题意,我们需要遍历整棵树,然后输出每一层最右的节点value。
递归 (Depth-First-Search, DFS)
class Solution(object):
def rightSideView(self, root):
self.view = []
self.dfs(root, 1)
return self.view
def dfs(self, root, layer):
if root is None: return # break point
if layer > len(self.view): self.view.append(root.val) # add data point, 确保每一层只加入一个值。 从右往左。
self.dfs(root.right, layer+1) # 右节点,进入下一层
self.dfs(root.left, layer+1) # 左节点,进入下一层,如果右节点没有值,那么会把左节点加入到list
迭代 + stack (Depth-First-Search, DFS) - 利用stack存每一层的
class Solution(object):
def rightSideView(self, root):
view = []
stack = [(root, 0)]
while stack:
# stack, FILO
current, layer = stack.pop() # assgin the tuple to each
if current:
if len(view) == layer: # 判断点。 每层只添加一个最右的节点。
view.append(current.val)
stack.append((current.left, layer+1)) # 因为利用stack,先进后出,所以把右节点后存入
stack.append((current.right, layer+1))
return view
迭代 + queue (Breadth-First-Search, BFS)
class Solution(object):
def rightSideView(self, root):
view = []
queue = [(root, 0)]
while queue:
# queue, FIFO
current, layer = queue.pop(0) # pop(0), pop the first element, instead of last element
if current:
if len(view) == layer:
view.append(current.val)
queue.append((current.right, layer+1)) #利用queue,先进先出,所以右节点先存入
queue.append((current.left, layer+1))
return view