题目:给定一棵二叉树,每个节点的信息包括左右节点的指针,以及其本身的值。让你给出二叉树的“右视图”, 即从上至下给出每一层最右边的节点。
这题可以用宽度优先搜索的方法来做,具体实现用队列,因为每一层右边的节点有这样的性质:如果对于每个节点,都是左子节点较右子节点先入队,那每一层最右边的节点总是该层最后一个出队的。具体维护用一个向量来实现即可。
然而这道题一开始就设定好了结构体,但有个问题是,结构体中没有给出该节点所在的层数,所以不能直接拿来遍历,因为遍历到某个节点的时候,你不知道该节点是那一层的,不知道该更新“右视图”的哪一个元素。
而我的做法是再创建一个结构体,成员变量为TreeNode的指针,与该节点所在的层数。以此来构建BFS队列,具体实现如下。设节点数为n,由于每个节点只要遍历一次,所以时间复杂度为O(n)。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
struct U {
TreeNode *tn ;
int level ;
U() : level(0), tn(NULL) {}
U(int l, TreeNode *n) : level(l), tn(n) {}
};
class Solution {
public:
vector<int> rightSideView(TreeNode* root) {
vector<int> ans ;
queue<U> q ;
q.push(U(0, root)) ;
while (!q.empty()) {
U u = q.front() ; q.pop() ;
int l = u.level ;
if ((u.tn) == NULL) continue ;
int v = (u.tn)->val ;
if (l >= ans.size()) ans.push_back(0) ;
ans[l] = v ;
q.push(U(l + 1, (u.tn)->left )) ;
q.push(U(l + 1, (u.tn)->right)) ;
}
return ans ;
}
};