写二叉树的题之前,必须确定二叉树的遍历顺序
● 层序遍历
看完卡尔的视频理解了,但是在实际做的时候遇到了浅拷贝与深拷贝的问题,就是在我标注问号的地方,你虽然先把list赋值给res了,然后才把list清空,但是,实际上刚刚赋值给res的元素也被清空了,也就是说,list赋值给res是个引用的操作。所以就有了浅拷贝和深拷贝的问题,正确做法是,每到一个循环,就重新申请一个List,上面是问题代码,下面是有效代码。
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
Deque<TreeNode> queue = new LinkedList<>();
List<List<Integer>> res = new ArrayList<>();
List<Integer> list = new ArrayList<>();?????
if(root == null) return res;
queue.offer(root);
while(!queue.isEmpty()){
int size = queue.size();
for(int i = 0;i<size;i++){
TreeNode head = queue.remove();
if(head.left!=null){
queue.offer(head.left);
}
if(head.right!=null){
queue.offer(head.right);
}
list.add(head.val);
}
res.add(list);//?????????
list.clear();//?????
}
return res;
}
}
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
Deque<TreeNode> queue = new LinkedList<>();
List<List<Integer>> res = new ArrayList<>();
if(root == null) return res;
queue.offer(root);
while(!queue.isEmpty()){
List<Integer> list = new ArrayList<>();
int size = queue.size();
for(int i = 0;i<size;i++){
TreeNode head = queue.remove();
if(head.left!=null){
queue.offer(head.left);
}
if(head.right!=null){
queue.offer(head.right);
}
list.add(head.val);
}
res.add(list);
}
return res;
}
}
● 226.翻转二叉树
需要注意的是,最后return的是root,这题怪怪的,感觉会了,但又感觉不会。之后复习还要再看
class Solution {
public TreeNode invertTree(TreeNode root) {
if(root == null){
return null;
}
TreeNode tmp = root.left;
root.left = root.right;
root.right = tmp;
invertTree(root.left);
invertTree(root.right);
return root;
}
}
101.对称二叉树
有点没听懂,仔细想想就大概了解了,主要还是递归。
class Solution {
public boolean isSymmetric(TreeNode root) {
return compare(root.left,root.right);
}
public static boolean compare(TreeNode left,TreeNode right){
if(left==null&&right==null){
return true;
}else if(left==null&&right!=null){
return false;
}else if(left!=null&&right==null){
return false;
}
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;//我一开始写成outside==inside了,肯定不对啊
}
}