102. Binary Tree Level Order Traversal
层序遍历二叉树,返回每一层的结点数,每一层放在一个列表中。
用递归法要记住在所层数:
public List<List<Integer>> levelOrder(TreeNode root) {
if (root == null) return res;
helper(root, 0);
return res;
}
List<List<Integer>> res = new ArrayList<>();
public void helper(TreeNode root, int depth) {
if (root == null) return;
while (res.size() <= depth) res.add(new ArrayList<>());
res.get(depth).add(root.val);
helper(root.left, depth+1);
helper(root.right, depth+1);
}
107. Binary Tree Level Order Traversal II
和上题一样,但是最下面一层放在第一排。
用了LinkedList直接将新的列表插在最前面,就不用最后再反转了:
public List<List<Integer>> levelOrderBottom(TreeNode root) {
LinkedList<List<Integer>> res = new LinkedList<>();
if (root == null) return res;
Queue<TreeNode> queue = new LinkedList();
queue.offer(root);
while (!queue.isEmpty()) {
int n = queue.size();
List<Integer> row = new ArrayList<>();
while (n > 0) {
TreeNode temp = queue.poll();
row.add(temp.val);
if (temp.left != null)
queue.offer(temp.left);
if (temp.right != null)
queue.offer(temp.right);
n--;
}
res.addFirst(row);
}
return res;
}
872. Leaf-Similar Trees
给两棵树,判断他们的叶子结点组成的数组是否一致,顺序也要一致。
想了半天不创建列表的方法,最后发现行不通:
public boolean leafSimilar(TreeNode root1, TreeNode root2) {
List<Integer> res1 = new ArrayList<>();
List<Integer> res2 = new ArrayList<>();
helper(root1, res1);
helper(root2, res2);
if (res2.size() != res1.size())
return false;
for (int i = 0; i < res1.size(); i++) {
if (res1.get(i) != res2.get(i))
return false;
}
return true;
}
public void helper(TreeNode root, List<Integer> leaf) {
if (root == null)
return;
if (root.left == null && root.right == null)
leaf.add(root.val);
helper(root.left, leaf);
helper(root.right, leaf);
}