题目:
Given a binary tree, imagine yourself standing on the right side of it, return the values of the nodes you can see ordered from top to bottom.
Example:
Input: [1,2,3,null,5,null,4] Output: [1, 3, 4] Explanation: 1 <--- / \ 2 3 <--- \ \ 5 4 <---
本质上就是个level order traversal,第一反应就是level order每层取最右加进去就完事了。
Runtime: 1 ms, faster than 78.65% of Java online submissions for Binary Tree Right Side View.
Memory Usage: 37.4 MB, less than 14.17% of Java online submissions for Binary Tree Right Side View.
/**
* Definition for a binary tree node.
* public 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;
* }
* }
*/
class Solution {
public List<Integer> rightSideView(TreeNode root) {
List<Integer> result = new ArrayList<>();
if (root == null) {
return result;
}
Queue<TreeNode> queue = new ArrayDeque<>();
queue.add(root);
while (!queue.isEmpty()) {
int size = queue.size();
for (int i = 0; i < size; i++) {
TreeNode node = queue.poll();
if (i == size - 1) {
result.add(node.val);
}
if (node.left != null) {
queue.add(node.left);
}
if (node.right != null) {
queue.add(node.right);
}
}
}
return result;
}
}
然后听说这道题还能用递归做,为了练习一下我就写一下吧。嗯,果然不会写。看了答案,就是非常简单的dfs了,递归的时候先递归右边再递归左边,递归函数里加上level和result,每次判断如果当前level == result.size(),就说明我们来到了新的一层。因为是先递归的right,来到新的一层的时候一定是先出现最右的节点,也就是最后要的那个节点,于是就把它加进result里。
Runtime: 0 ms, faster than 100.00% of Java online submissions for Binary Tree Right Side View.
Memory Usage: 37.8 MB, less than 14.17% of Java online submissions for Binary Tree Right Side View.
/**
* Definition for a binary tree node.
* public 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;
* }
* }
*/
class Solution {
public List<Integer> rightSideView(TreeNode root) {
List<Integer> result = new ArrayList<>();
helper(root, result, 0);
return result;
}
private void helper(TreeNode root, List<Integer> result, int level) {
if (root == null) {
return;
}
if (level == result.size()) {
result.add(root.val);
}
helper(root.right, result, level + 1);
helper(root.left, result, level + 1);
}
}