leetcode 199. 二叉树的右视图 - RLH 遍历(先序遍历的倒序)- 层次遍历 - 初始化用例节点

题目来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems
特别鸣谢:来自夸夸群的 醉笑陪公看落花@知乎王不懂不懂@知乎QFIUNE@csdn
感谢醉笑陪公看落花@知乎 倾囊相授,感谢小伙伴们督促学习,一起进步

给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。

在这里插入图片描述

输入: [1,2,3,null,5,null,4]
输出: [1,3,4]

输入: [1,null,3]
输出: [1,3]

来源:https://leetcode-cn.com/problems/binary-tree-right-side-view/

题目分析

只要先把树每一层的最右侧节点和层数记录下来,即可得到右视图,可以用深度遍历和层次遍历实现

RLH 遍历(先序遍历的倒序)

这样可以保证每一层最靠近右边的节点被记录下来,用字典来控制每一层节点是否被记录

class Solution:
    def rightSideView(self, root: TreeNode) -> list[int]:
        memor = {}
        def RLH(root,h):
            if not root:return root
            RLH(root.right,h+1)
            RLH(root.left,h+1)
            if h not in memor:memor[h] = root.val
        RLH(root,0)
        return [memor[x] for x in sorted(memor.keys())]

层次遍历 layer

class Solution:
    def rightSideView(self, root: TreeNode) -> List[int]:
        ans = []
        if root == None:return []
        def layer(root):
            qs = [root]
            while len(qs)>0:
                ans.append(qs[-1].val)
                child = []
                for q in qs:
                    if q.left:child.append(q.left)
                    if q.right:child.append(q.right)
                qs = child
        layer(root)
        return ans

初始化用例节点

题目给出的是一个列表,不好调试,这里给出生成树的代码

[1,2,3,null,5,null,4] ==》 root

# Definition for a binary tree node.
class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right
        
def bfs(btree,i):
    if i >= len(btree):return None
    if btree[i] == None:return None
    root = TreeNode(btree[i])
    root.left = bfs(btree, 2*i+1)
    root.right = bfs(btree, 2 * i + 2)
    return root

btree = [1,2,3,None,5,None,4]
root = bfs(btree,0)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值