【问题描述】199.二叉树的右视图
给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
示例:
输入: [1,2,3,null,5,null,4]
输出: [1, 3, 4]
解释:
1 <---
/ \
2 3 <---
\ \
5 4 <---
【解答思路】
1. BFS
层次遍历时保存每层的最右一个节点
时间复杂度:O(N) 空间复杂度:O(N)
public List<Integer> rightSideView(TreeNode root) {
if(root == null){
return new ArrayList<>();
}
List<Integer> ret = new ArrayList<>();
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while(!queue.isEmpty() ){
每层的size
int size = queue.size();
//遍历当层
for(int i =0; i<size ;i++){
TreeNode node = queue.poll();
//最右边
if(size-1 == i ){
ret.add(node.val);
}
//遍历当层节点,添加下一层节点
if(node.left!=null){
queue.offer(node.left);
}
if(node.right!=null){
queue.offer(node.right);
}
}
}
return ret;
}
2. DFS
前序遍历改造,先访问右子树
时间复杂度:O(N) 空间复杂度:O(N)
public List<Integer> rightSideView(TreeNode root) {
List<Integer> res = new ArrayList<>();
dfs(root, 0, res);
return res;
}
private void dfs(TreeNode node, int level, List<Integer> res) {
if (node == null)
return;
if (level == res.size())
res.add(node.val); // 每一层的第一个节点
dfs(node.right, level+1, res);
dfs(node.left, level+1, res);
}
【总结】
1.二叉树遍历
- 前序遍历 先输出当前结点的数据,再依次遍历输出左结点和右结点
- 中序遍历 先遍历输出左结点,再输出当前结点的数据,再遍历输出右结点
- 后续遍历 先遍历输出左结点,再遍历输出右结点,最后输出当前结点的数据
2. Queue操作
image