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]
.
url: https://leetcode.com/problems/binary-tree-right-side-view/
可用一个二维数组按层储存整个树,再返回每层书最右元素即可。
class Solution {
public:
vector<int> rightSideView(TreeNode* root) {
vector<int> result;
vector<vector<int>> traverse_result;
TreeNode *cur = root;
traverseTree(0, root, traverse_result);
for (int i = 0; i < traverse_result.size(); ++i)
{
result.push_back(*(traverse_result[i].crbegin()));
}
return result;
}
private:
void traverseTree(int currentLevel, TreeNode* node, vector<vector<int>> &traverse_result) {
if (node == NULL)
return;
if (currentLevel >= traverse_result.size()){
vector<int> newVector;
traverse_result.push_back(newVector);
}
traverse_result[currentLevel].push_back(node->val);
traverseTree(currentLevel+1, node->left, traverse_result);
traverseTree(currentLevel+1, node->right, traverse_result);
}
};
根据Discuss思路, 另写一算法如下。时间复杂度并未变,但是减少了push的次数,可以略微加快速度。关键是其思路十分巧妙,利用了max_level和先又再左的递归顺序保证了只有第一个到达新的level的最右element会被push进result
class Solution {
public:
int max_level = -1;
vector<int> result;
vector<int> rightSideView(TreeNode* root) {
helper(0, root);
return result;
}
private:
void helper(int height, TreeNode *node){
if(node == NULL)
return;
if(height > max_level) {
result.push_back(node->val);
max_level = height;
}
helper(height+1, node->right);
helper(height+1, node->left);
}
};