这道题其实本身没有什么难度,就是层序遍历保留每一层最后一个值。但是以什么方式来区分每一层还是有不同思路的。
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; }