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()).(
TreeNode) // 当次节点
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
}

···

posted on 2021-11-13 21:41  进击的davis  阅读(37)  评论(0编辑  收藏  举报

导航