【问题描述】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() ){每层的sizeint 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. 前序遍历改造,先访问右子树
时间复杂度: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.二叉树遍历
- 前序遍历 先输出当前结点的数据,再依次遍历输出左结点和右结点
- 中序遍历 先遍历输出左结点,再输出当前结点的数据,再遍历输出右结点
- 后续遍历 先遍历输出左结点,再遍历输出右结点,最后输出当前结点的数据