题目:
给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
示例:
解题思路:
解法1:层序遍历。将用一个queue去遍历每一层的节点,记住每一层的size,取最后一个值保存到arraylist即可。
解法2:深度遍历,以根-右子树-左子树的方式遍历(与先序遍历相反)。同时记录深度,用list保存某一深度的第一个节点。
参考:
甜姐力扣199题解
Java代码
//解法1
class Solution {
public List<Integer> rightSideView(TreeNode root) {
List<Integer> res = new ArrayList<>();
Queue<TreeNode> queue = new ArrayDeque<>();
if(root != null){
queue.add(root);
}
while(!queue.isEmpty()){
int n = queue.size();
for(int i = 0;i<n;i++){
TreeNode node = queue.poll();
if(node.left != null){
queue.add(node.left);
}
if(node.right != null){
queue.add(node.right);
}
if(i == n-1){
res.add(node.val);
}
}
}
return res;
}
}
//解法2:
class Solution {
List<Integer> res = new ArrayList<>();
public List<Integer> rightSideView(TreeNode root) {
dfs(root,0);
return res;
}
public void dfs(TreeNode node,int depth){
if(node == null){
return;
}
if(depth == res.size()){
res.add(node.val);
}
dfs(node.right,depth+1);
dfs(node.left,depth+1);
}
}
复杂度分析:
解法1:遍历所有节点,时间复杂度是O(n),空间复杂度看情况,最坏是O(n),返回list存储了深度个数的值,队列存储了最多节点的那一层数量,树退化为线性时需要O(n)。
解法2:时间复杂度也是O(n),遍历所有节点,空间复杂度为O(n),最低为logN。