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
}