给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
示例:
输入: [1,2,3,null,5,null,4] 输出: [1, 3, 4] 解释: 1 <--- / \ 2 3 <--- \ \ 5 4 <---
解法一:
//时间复杂度O(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) {}
* };
*/
class Solution {
public:
vector<int> rightSideView(TreeNode* root) {
if(!root) return {};
vector<int> res;
queue<TreeNode*> q1, q2;
q1.push(root);
while(!q1.empty()) {
q1.swap(q2);
while(true) {
TreeNode* temp = q2.front();
q2.pop();
if(temp->left) q1.push(temp->left);
if(temp->right) q1.push(temp->right);
if(q2.empty()) {
res.push_back(temp->val);
break;
}
}
}
return res;
}
};
解法二:
//时间复杂度O(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) {}
* };
*/
class Solution {
public:
void rightSideView(TreeNode* root, int cur, vector<int>& res) {
if(!root) return;
if(cur == res.size()) res.push_back(root->val);
rightSideView(root->right, cur + 1, res);
rightSideView(root->left, cur + 1, res);
}
vector<int> rightSideView(TreeNode* root) {
vector<int> res;
rightSideView(root, 0, res);
return res;
}
};
解法一:
BFS。层序遍历需要一个队列,解法一用了两个队列来区别相邻两层的边界,以便找出每一层最右的结点。也可以只用一个队列来实现,需要一个额外的指针记录每层最右的结点。
解法二:
DFS。根据res数组的大小和当前层数来判断是否是当前层最右结点。先根结点,再右子结点,然后是左子结点,这样每次到下一层里遇到的第一个结点就是最右结点。
2020/01/06 13:01