二叉树——二叉树的右视图
给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
核心思路: 层序遍历(BFS),每一层只保留最后一个节点
完整代码实现如下:
import java.util.*;
class Solution {
public List<Integer> rightSideView(TreeNode root) {
List<Integer> res = new ArrayList<>();
if (root == null) return res;
Queue<TreeNode> q = new LinkedList<>();
q.offer(root);
while (!q.isEmpty()) {
int size = q.size();
// 遍历当前一层所有节点
for (int i = 0; i < size; i++) {
TreeNode node = q.poll();
// 每一层的最后一个,就是右视图看到的节点
if (i == size - 1) {
res.add(node.val);
}
if (node.left != null) q.offer(node.left);
if (node.right != null) q.offer(node.right);
}
}
return res;
}
}
// 树节点定义
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;
}
}
思路:
- 用队列按层遍历二叉树
- 每一层节点数量 = queue.size()
- 每层最后一个节点->就是从右边看到的节点
- 把它加入结果集合即可
代码解释:
在添加节点入队的时候,会出现右子树还未出队,左子树的左右孩子入队,虽然目前来看右子树和左子树的左右孩子不处于同一层,但因为右子树还未出队,for循环是还未执行完的,只有当右子树也出队,代码已经到了这一层的最后一个节点,for循环才结束,此时右子树的左右孩子也入队,for循环结束,回到外层while循环中,更新队列新长度,队列新长度此时就是新一层节点的长度。因此在入队出队的过程中虽然会出现不同层的节点处于同一队列中的情况,但是size依然是上一层的长度,只有上一层的节点完全出队,下一层的节点完全入队,队列长度才会更新成下一层的节点长度,从而执行下一个for循环,下一层的节点提前入队时为了满足外层while循环,必须保持队列非空的状态,才能一直进入到for循环当中进行层序遍历。只有队列完全为空,不满足while循环的条件while(!q.isEmpty())外层循环才会彻底结束。
浙公网安备 33010602011771号