0199-二叉樹的右檢視
給定一個二叉樹的 根節點 root,想象自己站在它的右側,按照從頂部到底部的順序,返回從右側所能看到的節點值。
示例 1:
輸入:[1,2,3,null,5,null,4]
輸出:[1,3,4]
示例 2:
輸入:[1,null,3]
輸出:[1,3]
示例 3:
輸入:[]
輸出:[]
提示:
二叉樹的節點個數的範圍是 [0,100]
-100<= Node.val <= 100
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/binary-tree-right-side-view
思路:
層序遍歷的時候,判斷是否遍歷到單層的最後面的元素,如果是,就放進result陣列中,隨後返回result就可以了
python
···
0199.二叉樹的右檢視
class Solution:
def levelOrder(self, root: TreeNode) -> [int]:
"""
迭代法:雙端佇列,每次把單層的節點遍歷出佇列,另外將對應的左右節點加入佇列
:param root:
:return:
"""
results = []
if not root:
return results
from collections import deque queue = deque([root]) # 初始化佇列 while queue: size = len(queue) # 遍歷佇列單層長度 node = queue[-1] # 每次取最後一個節點 results.append(node.val) for _ in range(size): cur = queue.popleft() # 通過size控制遍歷次數 if cur.left: # 添加當前pop節點的左節點進入佇列 queue.append(cur.left) if cur.right: # 添加當前pop節點的右節點進入佇列 queue.append(cur.right) return results def levelOrderRecur(self, root: TreeNode) -> [[int]]: """ 遞迴法, :param root: :return: """ res = [] def levelOrder(node, index): if not node: # 空,返空 return [] if len(res) < index: # 開始當前depth res.append([]) res[index-1].append(node.val) # 當前層加入節點值到結果集 if node.left: # 當前節點有左節點,繼續遞迴,同時層數加1 levelOrder(node.left, index+1) if node.right: # 當前節點有右節點,繼續遞迴,同時層數加1 levelOrder(node.right, index+1) levelOrder(root, 1) # 1層開始遞迴 return res
···
golang
···
package binaryTree
import "container/list"
// 迭代遍歷
func rightSideView(root TreeNode) []int {
var res = [][]int{}
if root == nil { // 空時返回
return res
}
queue := list.New() // 佇列初始化
queue.PushBack(root)
var tmpArr []int
for queue.Len() > 0 {
length := queue.Len()
for i:=0;i<length;i++ { // 遍歷當層的節點
node := queue.Remove(queue.Front()).(
if node.Left != nil { // 節點的左節點入隊
queue.PushBack(node.Left)
}
if node.Right != nil { // 節點的右節點入隊
queue.PushBack(node.Right)
}
tmpArr = append(tmpArr, node.Val) // 節點值加入結果集
}
res = append(res, tmpArr)
tmpArr = []int{}
}
finalRes := []int{} // 將層序遍歷結果取每層節點的最後一個值即可
for i:=0;i<len(res);i++ {
finalRes = append(finalRes, res[i][len(res[i])-1])
}
return finalRes
}
···