LeetCode-Python-199. 二叉树的右视图

647 篇文章 23 订阅

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

示例:

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

   1            <---
 /   \
2     3         <---
 \     \
  5     4       <---

思路:

先把二叉树的层序遍历搞定,然后把每一层最后一个加入到result里即可。

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    def rightSideView(self, root):
        """
        :type root: TreeNode
        :rtype: List[int]
        """
        if not root:
            return []
        next_layer = [root]
        result = [root.val]
        while(next_layer):
            temp_next_layer = []
            for node in next_layer:
                if not node:
                    continue
                if node.left:
                    temp_next_layer.append(node.left)
                if node.right:
                    temp_next_layer.append(node.right)
            # print temp_next_layer[0].val
            if temp_next_layer:
                next_layer = temp_next_layer
                result.append(temp_next_layer[-1].val)
                # print result
            else:
                break
            
        return result
                

下面的层序遍历写于2019年7月24日12:41:32 

class Solution(object):
    def rightSideView(self, root):
        """
        :type root: TreeNode
        :rtype: List[int]
        """
        queue = [root]
        res = []
        while queue:
            next_queue, layer = [], []
            for node in queue:
                if node:
                    layer.append(node.val)
                    next_queue += [node.left, node.right]
            queue = next_queue[:]
            if layer:
                res.append(layer[-1])
        return res

第二种思路:

利用前序遍历+哈希表,记录下每一层最后访问的最右节点的值。 

class Solution(object):
    def rightSideView(self, root):
        """
        :type root: TreeNode
        :rtype: List[int]
        """
        dic = dict()
        
        def dfs(root, depth):
            if not root:
                return
            dic[depth] = root.val
            dfs(root.left, depth + 1)
            dfs(root.right, depth + 1)
        dfs(root, 0)
        return list(dic.values())

第三种思路:

DFS搜索,先右子树再左子树的搜索顺序,这样保障每一层搜索到的第一个节点都是最右的节点,

当搜索到新的一层时,就把第一个有效节点放到答案里。

class Solution(object):
    def rightSideView(self, root):
        """
        :type root: TreeNode
        :rtype: List[int]
        """
        res = []
        def dfs(node, depth):
            if not node:
                return
            if depth > len(res):
                res.append(node.val)
            dfs(node.right, depth + 1)
            dfs(node.left, depth +1)
            
            
        dfs(root, 1)
        return res

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值