二叉树的层序遍历
类似图论的广度优先搜索,一层一层地遍历二叉树取出结果。
我们需要使用到队列,因为每一层元素符合先进先出的特点。
注意:需要一个变量size记录每一层需要弹出多少个元素,避免两层元素同时存在队列中时,不知道应该弹出多少个元素。
例题:102. 二叉树的层序遍历
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
Queue<TreeNode> queue = new LinkedList();
List<List<Integer>> result = new ArrayList<List<Integer>>();
int size = 0;
if(root != null) queue.offer(root);
while(!queue.isEmpty()){
size = queue.size();
List<Integer> list = new ArrayList<Integer>();
while(size>0){
TreeNode node = queue.poll();
list.add(node.val);
if(node.left != null) queue.offer(node.left);
if(node.right != null) queue.offer(node.right);
size--;
}
result.add(list);
}
return result;
}
}
226. 翻转二叉树
思路:递归进行翻转,适合用前序和后序遍历。
class Solution {
public TreeNode invertTree(TreeNode root) {
reveseTree(root);
return root;
}
private void reveseTree(TreeNode node){
if(node == null){
return;
}
TreeNode temp = new TreeNode();
temp = node.left;
node.left = node.right;
node.right = temp;
reveseTree(node.left);
reveseTree(node.right);
}
}
101. 对称二叉树
思路:递归后序遍历,比较左右子树的外侧结点和比较左右子树的内侧结点,比较完结果返回给上一层。对称的特征是左子树经过翻转等于右子树。
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;}
else if(left!=null && right==null){return false;}
else if(left==null && right==null){return true;}
else if(left.val != right.val){return false;}
boolean outside = compare(left.left, right.right);
boolean inside = compare(left.right, right.left);
return outside && inside;
}
}