题目:
给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
示例:
输入: [1,2,3,null,5,null,4]
输出: [1, 3, 4]
解释:
1 <---
/ \
2 3 <---
\ \
5 4 <---
思路:在网上找的大神的代码,原文链接:https://blog.csdn.net/mine_song/article/details/70213524
刚开始我理解错了,以为右视图就是右子树的所有右节点,实际上并不是,是每一层最右边的节点。使用广度优先搜索,对树进行层次遍历,记录每一层最右边的节点。
这个我再做的时候理解对了,想到使用层次遍历,记录每一层的节点个数,将最后一个节点加入到结果中。但是对于层次遍历我还是不怎么熟。。。这个要在看看。
代码:
public List<Integer> rightSideView(TreeNode root) {
List<Integer> ret = new ArrayList<>();
if (root == null)
return ret;
bfs(root, ret);
return ret;
}
private void bfs(TreeNode root, List<Integer> ret) {
Queue<TreeNode> q = new LinkedList<>();
q.add(root);
// 层次遍历,只需要记录本层结点个数即可
int curNum = 1;
// 下一层的节点数
int nextNum = 0;
while (!q.isEmpty()) {
TreeNode node = q.poll();
if (curNum == 1)
ret.add(node.val);
curNum--;
if (node.left != null) {
q.offer(node.left);
nextNum++;
}
if (node.right != null) {
q.offer(node.right);
nextNum++;
}
if (curNum == 0) {
curNum = nextNum;
nextNum = 0;
}
}
}
执行最快的代码:
这个好像是前序遍历递归解法,当level等于size的时候说明是最右边的节点,直接接入就可以。
class Solution {
private List<Integer> result = new ArrayList<>();
public List<Integer> rightSideView(TreeNode root) {
getList(root, 0);
return result;
}
private void getList(TreeNode node, int level) {
if (node != null) {
if (level >= result.size()) {
result.add(node.val);
}
level++;
getList(node.right, level);
getList(node.left, level);
}
}
}