class Solution {
public List<Integer> rightSideView(TreeNode root) {
List<Integer> ans = new LinkedList<>();
if (root == null) return ans;
Queue<TreeNode> q = new LinkedList<>();
q.add(root);
while (!q.isEmpty()) {
Queue<TreeNode> t = new LinkedList<>();
int val = q.peek().val;
while (!q.isEmpty()) {
TreeNode node = q.poll();
val = node.val;
if (node.left != null) t.add(node.left);
if (node.right != null) t.add(node.right);
}
q = t;
ans.add(val);
}
return ans;
}
}
class Solution:
def rightSideView(self, root: Optional[TreeNode]) -> List[int]:
# 广度优先搜索
import collections
queue, res = collections.deque(), []
queue.append(root)
if not root:
return []
while queue:
length = len(queue)
for i in range(length):
node = queue.popleft()
# 添加子节点入队列
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
# 当前层的最后一个节点值添加到结果列表
res.append(node.val)
return res
class Solution:
def rightSideView(self, root: Optional[TreeNode]) -> List[int]:
# 实际上应该是求层序遍历中每层的最后一个节点的问题
if not root:
return []
queue1=collections.deque()
queue2=collections.deque()
ans=[]
queue1.append(root)
while queue1:
node=queue1.popleft()
if node.left:
queue2.append(node.left)
if node.right:
queue2.append(node.right)
if not queue1:
ans.append(node.val)
queue1,queue2=queue2,queue1
return ans
class Solution {
private List<Integer> res = new LinkedList<>();
public List<Integer> rightSideView(TreeNode root) {
if (root == null) {
return res;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
while (!queue.isEmpty()) {
int count = queue.size();
for (int i = 0; i < count; i ++) {
TreeNode node = queue.poll();
if (node.left != null) {
queue.add(node.left);
}
if (node.right != null) {
queue.add(node.right);
}
if (i == count - 1) {
res.add(node.val);
}
}
}
return res;
}
}
class Solution {
List<Integer> res = new LinkedList<>();
Map<Integer, Integer> map = new HashMap<>();
public List<Integer> rightSideView(TreeNode root) {
int i = 0;//用来表示树的当前层数
find(root, i);
res = new ArrayList(map.values());
return res;
}
public void find(TreeNode root, int i) {
if (root == null)
return;
//用来判断树的每一层的是否存放最右边的值了
if (!map.containsKey(i))
map.put(i, root.val);
i++;
find(root.right, i);
find(root.left, i);
}
}
class Solution:
def rightSideView(self, root: TreeNode) -> List[int]:
if not root: return []
num,res= [root],[]
while num:
res.append(num[-1].val)
for _ in range(len(num)):
tem = num.pop(0)
if tem.left: num.append(tem.left)
if tem.right:num.append(tem.right)
return res
共以下 30 个回答
层序遍历取最后一个元素
层序遍历,取每层最后一个
时间复杂度:O(n)
空间复杂度:O(n)
时间O(n)空间O(n)
时间复杂度:O(n)
空间复杂度:O(n)
时间复杂度:O(n)
空间复杂度:O(n)
思路:使用广度优先搜索方法,将每一层的最后一个节点值放入结果列表。
时间复杂度:O(n)
空间复杂度:O(n)
和前面一道题:层序遍历,返回一个二维列表一样的思路
时间 空间 O(n)
实现方式一:层次遍历+BFS。取每一层的最后一个节点加入到结果集。因为每一个节点都需要访问一次,所以时间复杂度为O(N),需要用到一个队列,空间复杂度为O(N)。
实现方式二:DFS。按先访问右节点,再访问左节点的顺序,只需取开始访问这一层的第一个节点加入到结果集中。时间和空间复杂度都为O(N)。
思路:哈希+DFS
时间复杂度:O(n),其中n为二叉树的节点数
空间复杂度:O(n)
时间复杂度:O(n)
空间复杂度:O(n)
层次遍历 时间复杂度O(n),空间复杂度O(n)
深度优先搜索;时间复杂度O(n),空间复杂度O(n)
//levelorder层序遍历
/**
* 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:
};
int i=1时,意味着一层中最后一个元素,这么把他拿出去
时间空间复杂度都为O(lgn)
层序遍历,两层while循环,入队再出队,size为0就结束内层循环.外层循环再更新size
时间O(n)
空间O(n)
使用层序遍历得到二叉树队列,同时建立一个深度队列对应节点队列,然后层序遍历每层最后一个节点放入到map中对应每一个深度的键,最后将map的值输出存储到数组中
层序遍历
用层序遍历解决
时间:O(n)
空间:O(n)
层序遍历取最后一位
时间复杂度O(N) 节点数目 空间复杂度O(N) 辅助队列
时间:O(n),空间:O(n)
层序遍历,每一层遍历时从右向左遍历,每一层的队头则为最右节点,得到右视图。时间O(n),空间O(n)