今天状态不是很好,不过题还是要刷的,下面就和大家来分享一下经验吧!
题目如下:
Given a binary tree, imagine yourself standing on the right side of it, return the values of the nodes you can see ordered from top to bottom.
Example:
Input: [1,2,3,null,5,null,4]
Output: [1, 3, 4]
Explanation:
1 <---
/ \
2 3 <---
\ \
5 4 <---
题意分析:
给定一个二分搜索树,想象一下你站在这棵树的右边看它,并有序返回从上到下你能看到的节点。
解答如下:
方法一(队列法)
在“https://blog.csdn.net/Vensmallzeng/article/details/88924863”方法二的基础上稍作修改便可用于解决本题。
修改要点:① 由于函数返回值类型为vector,所以res应该这样定义vector<int> res;
② 根据队列先进先出的原则,为了返回满足题意的结果,只需将每层的最后一个节点值存到res中就行,即:res.push_back( level.back() );
class Solution{
public:
vector<int> rightSideView( TreeNode* root ){
vector<int> res;
if ( !root )
return res;
queue< TreeNode* > q;
q.push( root );
while ( !q.empty() ){
vector<int> level; //建立存放每一层节点值的向量
for (int i = q.size(); i > 0 ; i--) { //存储某一层节点值以及下一层的节点
TreeNode* node = q.front();
q.pop();
level.push_back( node->val );
if ( node->left )
q.push( node->left );
if ( node->right )
q.push( node->right );
}
res.push_back( level.back() ); //res存储每层最后一个节点值得到最终结果
}
return res;
}
};
提交后的结果如下:
方法二(优化方法一)
方法一中用到了res和level两个向量,其实可以只用一个res向量。在每次开始遍历新一层节点之前,先把新一层的最后一个节点值存到res中即可。
注:这句 for (int i = q.size(); i > 0 ; i--) 可以改写成 int size = q.size(); for (int i = 0; i < size; i++) ,不过这样会导致空间复杂度变高。
class Solution{
public:
vector<int> rightSideView( TreeNode* root ){
vector<int> res;
if ( !root )
return res;
queue< TreeNode* > q;
q.push( root );
while ( !q.empty() ){
res.push_back( q.back()-> val ); //存放新一层的最后一个节点值
for (int i = q.size(); i > 0 ; i--) { //存储某一层节点值以及下一层的节点
TreeNode* node = q.front();
q.pop();
if ( node->left )
q.push( node->left );
if ( node->right )
q.push( node->right );
}
}
return res;
}
};
提交后的结果如下:
日积月累,与君共进,增增小结,未完待续。