Leetcode199.二叉树的右视图 Binary Tree Right Side View(Java)
##Tree##, ##Depth-first Search##, ##Breadth-first Search##
本题要求每一层的最右边元素,可以使用DFS、BFS
使用BFS的层次遍历更直观
BFS层次遍历做法
- 队列
q
中的元素为某一层的所有元素,count
代表该层的元素个数,即count = q.size()
count
次循环,将队列q
中的结点出队,并将每个遍历的结点的左结点和右结点加入到队列q
中,这样保证队列q
中包含下一层的所有结点- 对于每层的最后一个结点,即最右结点,即循环次数为第
count
次循环时,将遍历结点的值加入结果集合
时间复杂度: O(n)
class Solution {
public List<Integer> rightSideView(TreeNode root) {
List<Integer> res = new LinkedList<>();
Queue<TreeNode> q = new LinkedList<>();
if (root == null) return res;
q.add(root);
while (!q.isEmpty()) {
int count = q.size();
TreeNode curr;
for (int i = 0; i < count; i ++) {
curr = q.poll();
if (curr.left != null) q.add(curr.left);
if (curr.right != null) q.add(curr.right);
if (i == count - 1) res.add(curr.val);
}
}
return res;
}
}
DFS
- 深度优先遍历的遍历顺序为根=>右=>左,这样使得每层的最右边结点最先被遍历
- 当前深度
depth
和当前结果集合res
的大小相等时depth == res.size()
,表示该层的最右边结点还未被加入结果结合,此时被遍历的结点一定是最右结点,因为每层的最右边结点最先被遍历,故将该结点的值加入结果集合中
时间复杂度: O(n)
class Solution {
private List<Integer> res = new ArrayList<>();
public List<Integer> rightSideView(TreeNode root) {
dfs(root, 0);
return res;
}
private void dfs(TreeNode root, int depth){
if (root == null) return;
if (depth == res.size()) res.add(root.val);
dfs(root.right, depth + 1);
dfs(root.left, depth + 1);
}
}