LeetCode第199. 二叉树的右视图。
题目描述:
给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
例子:
1
2 3
4 5 6 7
8
非满二叉树, output [1, 3, 7, 8]
解题一:深度优先搜索
class Solution {
public List<Integer> rightSideView(TreeNode root) {
List<Integer> res = new ArrayList();
dfs(res, root, 0);
return res;
}
public void dfs (List<Integer> res, TreeNode root, int depth) {
if (root == null) return;
//此处判断是否为每一层的第一个节点,先入右节点,如果当前所在深度还没有出现在res里面,说明该节点是该深度下出现的第一个节点,将其写到res中。
if (depth == res.size()) {
res.add(root.val);
}
depth++;
dfs(res,root.right, depth); //先遍历右边,
dfs(res, root.left, depth);
}
}
解题二:层次遍历,广度优先搜索,遍历每一层,记录每一层的最右边元素
时间复杂度:O(n)
空间复杂度:O(n)
class Solution {
public List<Integer> rightSideView(TreeNode root) {
List<Integer> res = new ArrayList<>();
if (root == null) return res;
Queue<TreeNode> que = new LinkedList<>();
que.offer(root);
int start = 0;
int end = 1;
while (!que.isEmpty()) {
//先进左节点,再进有节点。que的最后上面的元素始终是每一层最右侧的元素。
TreeNode temp = que.poll();
start++;
if (temp.left != null) {
que.offer(temp.left);
}
if (temp.right != null) {
que.offer(temp.right);
}
if (start == end) {
start = 0;
end = que.size();
res.add(temp.val);
}
}
return res;
}
}
K