Problem
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.
For example:
Given the following binary tree,
1 <--- / \ 2 3 <--- \ \ 5 4 <---
You should return [1, 3, 4]
.
Solution
用DFS,pre-order 从右到左遍历二叉树,如果当前的深度比以前所有的深度都又增加了一,那就纪录下来。
/**
* 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 {
void dfs(TreeNode* root, int preDepth, int& maxDepth, vector<int>& rst){
if(!root) return;
if(preDepth + 1 > maxDepth){
rst.push_back(root->val);
maxDepth = preDepth + 1;
}
dfs(root->right, preDepth + 1, maxDepth, rst);
dfs(root->left, preDepth + 1, maxDepth, rst);
}
public:
vector<int> rightSideView(TreeNode* root) {
vector<int> rst;
int maxDepth = 0, preDepth = 0;
dfs(root, preDepth, maxDepth, rst);
return rst;
}
};
还可以用 BFS ,和一般的BFS相比,不同的一点是,需要一个 avail 变量来标志是否是当前level的第一个元素,如果是的话才能放到结果中去。
/**
* 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> rst;
if(!root) return rst;
queue<TreeNode*> curLvl, nextLvl;
curLvl.push(root);
bool avail = true;
while(!curLvl.empty()){
TreeNode* curNode = curLvl.front();
curLvl.pop();
if(avail){
rst.push_back(curNode->val);
avail = false;
}
if(curNode->right){
nextLvl.push(curNode->right);
}
if(curNode->left){
nextLvl.push(curNode->left);
}
if(curLvl.empty()){
swap(curLvl, nextLvl);
avail = true;
}
}
return rst;
}
};