剑指 Offer II 046. 二叉树的右侧视图

146 阅读1分钟

「这是我参与11月更文挑战的第12天,活动详情查看:2021最后一次更文挑战

给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。

image.png

输入: [1,2,3,null,5,null,4]
输出: [1,3,4]
示例 2:

输入: [1,null,3]
输出: [1,3]
示例 3:

输入: []
输出: []

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/WN…

思路

  • 首先根据题意,我们第一个想到的思路就是
    • 进行层序遍历,因为层序遍历可以进行每层的遍历

    • 那么我们去想,如果使用一个队列保存当前遍历的cur,另一个队列保存下一层的节点

    • 主要利用队列的先入先出的特点

  • 来看下面代码,每次cur代表的是当前遍历到的节点
    • q1队列一直出队列,当为空的时候,也就是以为着这一层遍历完了

    • 那么我们最后保存的那个节点(也可以理解为q1最后出队的节点),就是这一层的最后一个节点了

    • 所以res进行添加q1队列最后出队列的那一个节点

    • 最后将q2队列赋值给q1,重新创建q2对象

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public List<Integer> rightSideView(TreeNode root) {
        List<Integer> res = new LinkedList<>();
        if (root == null) {
            return res;
        }
        Queue<TreeNode> q1 = new LinkedList<>();
        Queue<TreeNode> q2 = new LinkedList<>();
        q1.offer(root);
        while (!q1.isEmpty()) {
            TreeNode cur = q1.poll();
            if (cur.left != null) {
                q2.offer(cur.left);
            }
            if (cur.right != null) {
                q2.offer(cur.right);
            }
            if (q1.isEmpty()) {
                res.add(cur.val);
                q1 = q2;
                q2 = new LinkedList<>();
            }
        }
        return res;
    }
}

此题完美的借用了层序遍历及队列的应用,当然也有其他解法,可以先走二叉树的最右边