题目
给定一个二叉树的 根节点 root
,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
示例 1:
输入: [1,2,3,null,5,null,4]
输出: [1,3,4]
示例 2:
输入: [1,null,3]
输出: [1,3]
示例 3:
输入: []
输出: []
提示:
- 二叉树的节点个数的范围是
[0,100]
-
解题方法
迭代法(BFS)
迭代法,从右向左层序遍历,将每一层的队列头部元素压入数组。
时间复杂度O(n)
,空间复杂度O(n)
C++代码:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} * }; */ class Solution { public: vector<int> rightSideView(TreeNode* root) { vector<int> result; queue<TreeNode*> nodes; if(root!=NULL) nodes.push(root); while(nodes.size()>0) { int size = nodes.size(); result.push_back(nodes.front()->val); for(int i=0; i<size; i++) { if(nodes.front()->right != NULL) nodes.push(nodes.front()->right); if(nodes.front()->left != NULL) nodes.push(nodes.front()->left); nodes.pop(); } } return result; } };
DFS
深度优先搜索,维护最大深度,使用
map
记录每层最右侧的节点。
时间复杂度O(n)
,空间复杂度O(n)
C++代码:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} * }; */ class Solution { public: vector<int> rightSideView(TreeNode* root) { vector<int> result; map<int, int> rightview; stack<TreeNode*> nodes; stack<int> depth; int maxdepth = -1; if(root==NULL) return result; nodes.push(root); depth.push(0); while(nodes.size()>0) { TreeNode *tmp = nodes.top(); nodes.pop(); int d = depth.top(); depth.pop(); if(tmp!=NULL) { maxdepth = max(maxdepth, d); if(rightview.find(d)==rightview.end()) rightview[d] = tmp->val; nodes.push(tmp->left); depth.push(d+1); nodes.push(tmp->right); depth.push(d+1); } } for(int i=0; i<=maxdepth; i++) result.push_back(rightview[i]); return result; } };