import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 *   public TreeNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param root TreeNode类 
     * @return int整型一维数组
     */
    public int[] leftSideView (TreeNode root) {
        // write code here
        List<Integer> ans = new ArrayList<>();
        if (root == null)
            return new int[0];
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        while (!queue.isEmpty()) {
            int n = queue.size();
            for (int i = 0; i < n; i++) {
                TreeNode node = queue.poll();
                if (i == 0)
                    ans.add(node.val);
                if (node.left != null)
                    queue.offer(node.left);
                if (node.right != null)
                    queue.offer(node.right);
            }
        }
        int[] result = new int[ans.size()];
        for (int i = 0; i < ans.size(); i++) {
            result[i] = ans.get(i);
        }
        return result;
    }
}

代码使用的编程语言是Java。

该题考察的知识点包括树的遍历和BFS(广度优先搜索)算法。

代码的解释如下:

  1. 首先定义了一个 TreeNode 类,表示二叉树的节点,包括节点的值 val、左子节点 left 和右子节点 right。
  2. 在 Solution 类中,定义了一个 leftSideView 方法,该方法接收一个 TreeNode 类型的参数 root,表示给定的二叉树的根节点。方法的返回类型为 int[],表示二叉树的左视图节点值。
  3. 在方法中,先创建了一个空的 ArrayList 对象 ans,用于存储左视图节点的值。
  4. 如果给定的根节点 root 为空,则直接返回一个空的 int[] 数组,表示左视图为空。
  5. 创建一个 Queue 对象 queue,用于辅助进行BFS算法。将根节点 root 入队。
  6. 进入 while 循环,当队列不为空时进行迭代。
  7. 在每次迭代中,首先获取当前层级的节点数量 n,然后遍历当前层级的节点。
  8. 依次从队列中出队一个节点 node。如果是当前层级的第一个节点(i == 0),则将其值 node.val 加入到 ans 列表中。
  9. 如果节点 node 的左子节点不为空,则将其左子节点入队。如果右子节点不为空,则将其右子节点入队。
  10. 循环结束后,已经遍历完了二叉树的所有节点,并且将左视图节点的值存储在 ans 列表中。
  11. 创建一个大小为 ans.size() 的 int[] 数组 result。
  12. 遍历 ans 列表,将其中的元素依次赋值给 result 数组。
  13. 最后返回 result 数组作为方法的结果,即二叉树的左视图节点值。

该算法使用 BFS(广度优先搜索)的思想,通过层级遍历二叉树,保证每一层的第一个节点一定是左视图节点。最终得到的 result 数组就是二叉树的左视图节点值。