这道题其实本身没有什么难度,就是层序遍历保留每一层最后一个值。但是以什么方式来区分每一层还是有不同思路的。
public static List<Integer> rightSideView(TreeNode root) {
if (root == null) {
return new ArrayList<>();
}
//偶数层节点数目
int evenNodeNum = 0;
//奇数层节点数目
int oddNodeNum = 0;
//当前是奇数层还是偶数层 true表示奇数层
boolean flag = true;
Queue<TreeNode> queue = new ArrayDeque<>();
List<Integer> list = new ArrayList<>();
queue.add(root);
oddNodeNum++;
while (!queue.isEmpty()) {
TreeNode temp = queue.poll();
if (flag) {
oddNodeNum--;
if (oddNodeNum == 0) {
list.add(temp.val);
}
} else {
evenNodeNum--;
if (evenNodeNum == 0) {
list.add(temp.val);
}
}
if (temp.left != null) {
if (flag) {
evenNodeNum++;
} else {
oddNodeNum++;
}
queue.add(temp.left);
}
if (temp.right != null) {
if (flag) {
evenNodeNum++;
} else {
oddNodeNum++;
}
queue.add(temp.right);
}
//如果当前是偶数层且偶数层的数目为0 则变为奇数层 反之变为偶数层
if (evenNodeNum == 0 && !flag || oddNodeNum == 0 && flag) {
flag = !flag;
}
}
return list;
}
虽然这个方法提示战胜了100%的java提交记录。但是用了3个变量。逻辑有点麻烦。
下面这个只用一个变量就可以
public static List<Integer> rightSideView1(TreeNode root) {
if (root == null) {
return new ArrayList<>();
}
List<Integer> list = new ArrayList<>();
Queue<TreeNode> queue = new ArrayDeque<>();
queue.add(root);
while (!queue.isEmpty()) {
//当前层的数目
int size = queue.size();
while (size != 0) {
TreeNode temp = queue.poll();
if (temp.left != null) {
queue.add(temp.left);
}
if (temp.right != null) {
queue.add(temp.right);
}
if (size == 1) {
list.add(temp.val);
}
size--;
}
}
int size = 0;
return list;
}