LeetCode:199. 二叉树的右视图 二叉树 层序遍历

199. 二叉树的右视图

leetcode 199 二叉树的右视图

题目描述

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

示例1:

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

示例2:

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

示例3:

输入: []
输出: []

说明:

  • 给定的树的节点数不会超过 1000
  • -100 <= Node.val <= 100

题目解析

我们可以采用层序遍历解决这个问题。

首先,我们将根节点root放入队列中,然后开始按层遍历队列,每次循环中从队列中取出一个节点,将其左右子节点放入队列中,直到队列为空。
在每一层中for i in range(0,que.size())进行以下操作:

  • que.pop()
  • que.append(cur->left) if cur->left
  • que.append(cur->right) if cur->right
    这样在每次循环中,就完成了对一层的遍历。

在遍历过程中,我们记录当前层的最后一个节点的值,并将其添加到结果列表中。

最后,我们返回结果列表。

复杂度分析

  • 时间复杂度: O ( n ) O(n) O(n),其中 n 是树中的节点数。
  • 空间复杂度: O ( n ) O(n) O(n),其中 n 是树中的节点数。

代码实现

Python版本:

class Solution(object):
    def rightSideView(self, root):
        if(root==None):
            return
        res=[]
        que=[root]
        while len(que)>0:
            n=len(que)
            for i in range(0,n):
                cur=que[0]
                que=que[1:]
                if i==n-1:
                    res.append(cur.val)
                if cur.left:
                    que.append(cur.left)
                if cur.right:
                    que.append(cur.right)
        return res

C++版本:

class Solution {
public:
    vector<int> rightSideView(TreeNode* root) {
        vector<int> ans;
        if(root==nullptr){
            return ans;
        }
        queue<TreeNode*> q;
        q.push(root);
        while(!q.empty()){
            int n=q.size();
            for(int i=0;i<n;i++){ 
                TreeNode* node = q.front();  
                q.pop();
                if(i==n-1){
                     ans.push_back(node->val);  
                }
                if(node->left){
                    q.push(node->left);
                }
                if(node->right){
                    q.push(node->right);
                }
            }
        }
        return ans;

    }

};

Go版本:

func rightSideView(root *TreeNode) []int {
        var res []int
        if(root==nil){
            return res
        }
        que:=[]*TreeNode{root}
        for len(que)>0 {
            n:=len(que)
            for i:=0;i<n;i++{
                cur:=que[0]
                que=que[1:]
                if(i==n-1){
                    res=append(res,cur.Val)
                }
                if(cur.Left!=nil){
                    que=append(que,cur.Left)
                }
                if(cur.Right!=nil){
                    que=append(que,cur.Right)
                }
            }
        }
        return res
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值