题目:LeetCode199.二叉树的右视图
给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
示例 1:
输入: [1,2,3,null,5,null,4]
输出: [1,3,4]
示例 2:
输入: [1,null,3]
输出: [1,3]
示例 3:
输入: []
输出: []
题目来源:LeetCode199.二叉树的右视图
题解
思路:层序遍历时记录每层的最后一个元素
在进行层序遍历时,用 size 来记录每层元素的个数,size 为 0 时说明这层元素已经遍历完,对于这题而言,层序遍历时每层的最后一个元素就是我们想要的,所以每层循环到 size - 1 时就需要将对应的元素保存起来。
示例过程如下所示:
节点 1 入队,此时 size = 1,说明第 1 层有 1 个元素
节点 1 出队后,其左孩子节点 2 和右孩子节点 3 入队,节点 1 为第 1 层的最后一个元素需要保存起来,下一轮的 size 变为 2,说明下一层有 2 个元素
节点 2 没有左孩子,节点 2 出队后,其右孩子节点 5 入队,而后 size 变为 1,说明第 2 层还剩一个元素,这个元素需要我们保存下来
节点 3 没有左孩子,节点 3 出队后,其右孩子节点 4 入队,节点 3 为 第 2 层的最后一个元素需要保存下来,下一轮的 size 变为 2,说明下一层有 2 个元素
节点 5 没有左右孩子,节点 5 出队后, size 变为 1,说明第 3 层还剩一个元素,这个元素需要我们保存下来
节点 4 没有左右孩子,节点 4 出队后,队列为空,结束遍历
代码:Java 实现
在 Java 中 LinkedList 是 Queue 的一个实现类
Queue 中部分方法如下所示:
方法 | 参数 | 返回 | 说明 |
---|---|---|---|
boolean offer(E e) | e - 要添加的元素 | 如果元素已添加到此队列返回 true,否则返回 false | 将指定元素入队 |
E poll() | 无 | 返回队列的头部元素,如果队列为空返回 null | 查看并删除队列的头部元素(元素出队) |
使用树的层序遍历来解决二叉树的右视图问题的 Java 代码如下:
public List<Integer> rightSideView(TreeNode root) {
List<Integer> res = new ArrayList<>();
if(root == null){
return res;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while(!queue.isEmpty()){
int size = queue.size();
for(int i=0; i<size; i++){
TreeNode node = queue.poll();
if(node.left != null){
queue.offer(node.left);
}
if(node.right != null){
queue.offer(node.right);
}
if(i == size-1){
res.add(node.val);
}
}
}
return res;
}
总结
本文通过在二叉树的层序遍历时记录每层的最后一个元素解决了 LeetCode199.二叉树的右视图问题,解题的关键在于要能够想到利用树的层序遍历。