给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
示例:
输入: [1,2,3,null,5,null,4] 输出: [1, 3, 4] 解释: 1 <--- / \ 2 3 <--- \ \ 5 4 <---
#include <iostream>
#include <vector>
using namespace std;
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
void print(vector<int> &r){
for(int i=0;i<r.size();i++){
std::cout<<r[i]<<" ";
}
std::cout<<std::endl;
}
class Solution {
public:
vector<int> rightSideView(TreeNode* root) {
vector<int> level;
vector<int> ret;
vector<TreeNode *> extend;
if(root==NULL){
return ret;
}
level.push_back(0);
extend.push_back(root);
int i = 0;
while(i<extend.size()){
TreeNode *p = extend[i];
if(p){
level[i] += 1;
if(p->left && p->right){
level.push_back(level[i]);
extend.push_back(p->left);
level.push_back(level[i]);
extend.push_back(p->right);
}else if(p->left){
level.push_back(level[i]);
extend.push_back(p->left);
}else if(p->right){
level.push_back(level[i]);
extend.push_back(p->right);
}
}
i++;
}
int c = -1;
for(int i=level.size()-1;i>=0;i--){
if(i==level.size()-1){
c = level[i];
ret.push_back(extend[i]->val);
}else if(level[i]<c){
c = level[i];
ret.push_back(extend[i]->val);
}
}
reverse(ret.begin(),ret.end());
return ret;
}
};
int main(){
Solution s;
TreeNode root(1);
TreeNode left(2);
TreeNode right(3);
TreeNode leftt(4);
root.left = &left;
root.right = &right;
left.left = &leftt;
vector<int>ret = s.rightSideView(&root);
print(ret);
return 0;
}
非递归版,AC100%