层序遍历
迭代思路
代码实现
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> res = new ArrayList<>();
if (root == null) return res;
Queue<TreeNode> queue = new ArrayDeque<>();
queue.offer(root);
while (!queue.isEmpty()) {
//解决“出几个”的问题
int size = queue.size();
ArrayList<Integer> path = new ArrayList<>();
while (size-- > 0) {
TreeNode poll = queue.poll();
path.add(poll.val);
if (poll.left != null) queue.offer(poll.left);
if (poll.right != null) queue.offer(poll.right);
}
res.add(path);
}
return res;
}
翻转二叉树
//使用递归
public TreeNode invertTree(TreeNode root) {
helper(root);
return root;
}
//确定递归函数的参数和返回值
public void helper(TreeNode root) {
//确定终止条件
if (root == null) return;
//确定单层循环的逻辑(函数自调用)
swap(root);
helper(root.left);
helper(root.right);
}
private void swap(TreeNode root) {
TreeNode temp = root.left;
root.left = root.right;
root.right = temp;
}
private boolean compare(TreeNode left, TreeNode right) {
if (left == null && right != null) {
return false;
}
if (left != null && right == null) {
return false;
}
if (left == null && right == null) {
return true;
}
if (left.val != right.val) {
return false;
}
// 比较外侧
boolean compareOutside = compare(left.left, right.right);
// 比较内侧
boolean compareInside = compare(left.right, right.left);
return compareOutside && compareInside;
}