categories: [Blog,Algorithm,mid]


199. 二叉树的右视图

难度中等416
给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
示例:
输入: [1,2,3,null,5,null,4]
输出: [1, 3, 4]
解释:
1 <—-
/ \
2 3 <—-
\ \
5 4 <—-

  1. public List<Integer> rightSideView(TreeNode root) {
  2. Map<Integer, Integer> rightmostValueAtDepth = new HashMap<Integer, Integer>();
  3. int max_depth = -1;
  4. Queue<TreeNode> nodeQueue = new LinkedList<TreeNode>();
  5. Queue<Integer> depthQueue = new LinkedList<Integer>();
  6. nodeQueue.add(root);
  7. depthQueue.add(0);
  8. while (!nodeQueue.isEmpty()) {
  9. TreeNode node = nodeQueue.remove();//等价removeFirst
  10. int depth = depthQueue.remove();
  11. if (node != null) {
  12. // 维护二叉树的最大深度
  13. max_depth = Math.max(max_depth, depth);
  14. // 由于每一层最后一个访问到的节点才是我们要的答案,因此不断更新对应深度的信息即可
  15. rightmostValueAtDepth.put(depth, node.val);
  16. nodeQueue.add(node.left);
  17. nodeQueue.add(node.right);
  18. depthQueue.add(depth + 1);
  19. depthQueue.add(depth + 1);
  20. }
  21. }
  22. List<Integer> rightView = new ArrayList<Integer>();
  23. for (int depth = 0; depth <= max_depth; depth++) {// =
  24. rightView.add(rightmostValueAtDepth.get(depth));
  25. }
  26. return rightView;
  27. }

BFS

  1. public List<Integer> rightSideView(TreeNode root) {
  2. List<Integer> res = new ArrayList<>();
  3. if (root == null) {
  4. return res;
  5. }
  6. Queue<TreeNode> queue = new LinkedList<>();
  7. queue.offer(root);
  8. while (!queue.isEmpty()) {
  9. int size = queue.size();
  10. for (int i = 0; i < size; i++) {
  11. TreeNode node = queue.poll();
  12. if (node.left != null) {
  13. queue.offer(node.left);
  14. }
  15. if (node.right != null) {
  16. queue.offer(node.right);
  17. }
  18. if (i == size - 1) { //将当前层的最后一个节点放入结果列表
  19. res.add(node.val);
  20. }
  21. }
  22. }
  23. return res;
  24. }
  25. 作者:sweetiee
  26. 链接:https://leetcode-cn.com/problems/binary-tree-right-side-view/solution/jian-dan-bfsdfs-bi-xu-miao-dong-by-sweetiee


DFS

  1. List<Integer> res = new ArrayList<>();
  2. public List<Integer> rightSideView(TreeNode root) {
  3. dfs(root, 0); // 从根节点开始访问,根节点深度是0
  4. return res;
  5. }
  6. private void dfs(TreeNode root, int depth) {
  7. if (root == null) {
  8. return;
  9. }
  10. // 先访问 当前节点,再递归地访问 右子树 和 左子树。
  11. if (depth == res.size()) { // 如果当前节点所在深度还没有出现在res里,说明在该深度下当前节点是第一个被访问的节点,因此将当前节点加入res中。
  12. res.add(root.val);
  13. }
  14. depth++;
  15. dfs(root.right, depth);///先添加又节点,执行左节点时 不满足if depth== 条件。
  16. dfs(root.left, depth);
  17. }
  18. 作者:sweetiee
  19. 链接:https://leetcode-cn.com/problems/binary-tree-right-side-view/solution/jian-dan-bfsdfs-bi-xu-miao-dong-by-sweetiee/