class Solution {
public List<List<Integer>> res = new ArrayList<List<Integer>>();
public List<List<Integer>> levelOrder(TreeNode root) {
checkLevelOrder(root, 0);
return res;
}
public void checkLevelOrder(TreeNode node, Integer deep){
if(node == null) return;
deep ++;
if(res.size() < deep){
List<Integer> item = new ArrayList<Integer>();
res.add(item);
}
//因为是按层数遍历,数的第一层就相当于存储在res数组下标为0的数组中所以要deep-1
res.get(deep - 1).add(node.val);
checkLevelOrder(node.left, deep);
checkLevelOrder(node.right, deep);
}
}
这题需要注意的点:如果使用递归遍历而非迭代遍历的话,递归时需要注意,中序遍历是有可能会翻转两次的。 以前序遍历为例,假设我需要镜像翻转一棵二叉树,实际上是根节点不动,先交换它的左右子树,接着左右子树再各自交换自己的左右子树,反复循环至全部结点交换完成。后序遍历的思想逻辑是左右根,也是同样的道理,只不过后序遍历是先把左子树给交换完再去交换右子树。但如果用中序遍历的话有可能会出现翻转两次的情况。
class Solution {
public TreeNode invertTree(TreeNode root) {
if(root == null){
return null;
}
invertTree(root.left);
invertTree(root.right);
swapChildren(root);
return root;
}
public void swapChildren(TreeNode root){
TreeNode tmp = root.left;
root.left = root.right;
root.right = tmp;
}
}
class Solution {
public boolean isSymmetric(TreeNode root) {
return compare(root.left, root.right);
}
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 compareInside && compareOutside;
}
}