class Solution {
List<List> list = new ArrayList<List>();
public List rightSideView(TreeNode root) {
List res = new ArrayList();
order(root,0);
for(int i = 0;i < list.size(); i++){
int len = list.get(i).size();
int val = list.get(i).get(len – 1);
res.add(val);
}
return res;
}
public void order(TreeNode root, int deep){
if(root null)return;
deep++;
if(list.size() < deep){
List item = new ArrayList();
list.add(item);
}
list.get(deep – 1).add(root.val);
order(root.left,deep);
order(root.right,deep);
}
}
收起
“`c++
class Solution {
public:
vector rightSideView(TreeNode* root) {
vector ans;
if (root == nullptr) return ans;
queue que;
que.push(root);
while (!que.empty()){
int len = que.size();
for (int i=0; ileft) que.push(cur->left);
if (cur->right) que.push(cur->right);
if (i == len-1) {
ans.push_back(cur->val);
}
}
}
return ans;
class Solution:
def rightSideView(self, root: Optional[TreeNode]) -> List[int]:
if not root:
return []
stack = collections.deque()
resright = []
res = []
stack.append(root)
while stack:
layer = []
for _ in range(len(stack)):
node = stack.popleft()
layer.append(node.val)
if node.left: stack.append(node.left)
if node.right: stack.append(node.right)
res.append(layer[-1])
return res
双o n
共以下 19 个回答
class Solution {> list = new ArrayList<List >(); rightSideView(TreeNode root) { res = new ArrayList (); item = new ArrayList ();
List<List
public List
List
order(root,0);
for(int i = 0;i < list.size(); i++){
int len = list.get(i).size();
int val = list.get(i).get(len – 1);
res.add(val);
}
return res;
}
public void order(TreeNode root, int deep){
if(root null)return;
deep++;
if(list.size() < deep){
List
list.add(item);
}
list.get(deep – 1).add(root.val);
order(root.left,deep);
order(root.right,deep);
}
}
收起
思路:层序遍历,将每一层的最后一个节点的值存储到结果集中
“`c++ rightSideView(TreeNode* root) { ans; que;left) que.push(cur->left);
class Solution {
public:
vector
vector
if (root == nullptr) return ans;
queue
que.push(root);
while (!que.empty()){
int len = que.size();
for (int i=0; i
if (cur->right) que.push(cur->right);
if (i == len-1) {
ans.push_back(cur->val);
}
}
}
return ans;
};
“`
java
class Solution {
}
DFS
O(N)
O(N)
提交
层次遍历,记录下每层的最后一个元素
**时间复杂度:O(N)
**空间复杂度:O(N)
class Solution { rightSideView(TreeNode* root) {
public:
vector
unordered_map<int, int> rightmostValueAtDepth;
int max_depth = -1;
};
思路:层序遍历,使用map记录下每一层最右边的节点
层序遍历,把每一层节点的数值存在一个数组里面,数组最后一个元素就组成了二叉树的右视图
class Solution { rightSideView(TreeNode root) { list = new ArrayList<>(); queue = new LinkedList<>();
public List
List
if(rootnull)
return list;
Queue
queue.add(root);
while(!queue.isEmpty()){
int size = queue.size();
for(int i = 0; i < size-1; i++){
TreeNode temp = queue.remove();
if(temp.left!=null) queue.add(temp.left);
if(temp.right!=null) queue.add(temp.right);
}
TreeNode temp = queue.remove();
if(temp.left!=null) queue.add(temp.left);
if(temp.right!=null) queue.add(temp.right);
list.add(temp.val);
}
return list;
}
}
//层序遍历 时空复杂度均为On
层序遍历变体
https://leetcode.cn/problems/binary-tree-right-side-view/solutions/2686065/er-cha-shu-de-you-shi-tu-by-yukislab-85ws
打卡,注意depthQueue的使用,这是记录队列内节点所在层数的一种方法
打卡
Definition for a binary tree node.
class TreeNode:
def init(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
class Solution:
def rightSideView(self, root: Optional[TreeNode]) -> List[int]:
if not root:
return []
stack = collections.deque()
resright = []
res = []
stack.append(root)
while stack:
layer = []
for _ in range(len(stack)):
node = stack.popleft()
layer.append(node.val)
if node.left: stack.append(node.left)
if node.right: stack.append(node.right)
res.append(layer[-1])
return res
双o n
层序遍历的每层最后一个即为右视图
/** rightSideView(TreeNode root) { res;
* 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
vector
if(!root) return res;
queue<TreeNode> q;
q.push(root);
while(!q.empty()){
int sz = q.size();
for(int i = 0; i < sz; i ++){
TreeNode node = q.front();
q.pop();
if(i 0) res.push_back(node->val);
if(node->right) q.push(node->right);
if(node->left) q.push(node->left);
}
}
return res;
}
};时间复杂度o(n),空间复杂度O(n)
时间复杂度O(n)
空间复杂度O(1)
想试试深度优先搜索结果没做出来
“`C++ rightSideView(TreeNode* root) {
class Solution {
public:
vector
if(root == nullptr)
{
return {};
}
};
“`
public List rightSideView(TreeNode root) { res =new ArrayList<>(); q=new LinkedList<>(); size-1) res.add(tmp.val);
List
if(rootnull) return res;
Queue
q.offer(root);
while(!q.isEmpty()){
int size =q.size();
for(int i=0;i<size;i++){
TreeNode tmp =q.poll();
if(tmp.left!=null) q.offer(tmp.left);
if(tmp.right!=null) q.offer(tmp.right);
if(i
}
}
return res;
}
思路:每次层序遍历的最后一个结点就是右边看到的第一个结点 层序遍历即可
day12第二题