题目描述
现在有一个二叉树,想象你是站在二叉树的右边看这棵树,从上到下返回你看到的节点的值。
样例
输入:一颗二叉树的根节点,二叉树如下图
1 <---
/ \
2 3 <---
\
5 <---
输出:[1, 3, 5]
解释:从右边看这颗二叉树,节点从上到下依次是1 3 5
算法
(指针) $O(n)$
二叉树按层遍历的变种,在这道题中,可以按层遍历二叉树,每层都是从右到左来访问,优先访问右边的节点,再返回每层的第一个节点(就是最右的节点即可)。在代码中,我把按层遍历的结果放到了一个数组中,用l r两个下标来记录每层的起始位置从而来方便地找到每一层的第一个节点。
C++ 代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<int> rightSideView(TreeNode* root) {
vector<int>res;
if(!root)
return res;
vector<TreeNode*>Nodes;//记录按层遍历的节点的数组
int l = 0, r = 0;
Nodes.push_back(root);
while(l<=r){//l r维护每一层的开始和结尾节点的位置
res.push_back(Nodes[l]->val);//返回每层的第一个节点
int cnt = 0;
for(int i = l;i<=r;i++){
if(Nodes[i]->right){//优先访问右边节点
Nodes.push_back(Nodes[i]->right);
cnt++;
}
if(Nodes[i]->left){
Nodes.push_back(Nodes[i]->left);
cnt++;
}
}
l = r+1;
r = l+cnt-1;
}
return res;
}
};
顶一下,感觉比官方题解还要简洁易懂!