站在二叉树右侧,返回从上到下能看到的节点值。
右视图不是简单沿着 right 指针向下走:某层没有右孩子时,左子树中的节点也可能被看到。本质是取得每一层最右侧的节点,因此使用层序 BFS。
按从左到右的顺序处理每层节点。每一层中最后访问到的节点,就是从右侧能看到的节点。
因此在每层开始时先固定当前层节点数 levelSize。当 i === levelSize - 1 时,说明当前节点是这一层最后一个节点,将它加入答案。
levelSize 必须在进入内层循环之前固定下来,因为处理当前层节点时,会不断把下一层节点加入队列。如果不先固定当前层大小,就会把下一层节点也混进当前层。
时间复杂度:O(n),每个节点只会被访问一次。
空间复杂度:O(n)。
当前实现使用 head 指针模拟出队,queue 中访问过的节点不会被删除,最坏情况下会保存所有节点。如果使用真正的队列结构,只看遍历过程中的待处理节点,辅助空间可以理解为 O(w),其中 w 是二叉树最大层宽。
[]。levelSize 要在每一层开始时固定,不能在循环过程中动态读取 queue.length。head 指针时,循环条件应该是 head < queue.length,不能只判断 queue.length > 0。