226.翻转二叉树
思路
1.递归思想,将一个节点左右子节点交换,交换完之后递归其左右子节点。
2.层序遍历(好像二叉树很多题都能用层序遍历)。在层序遍历入队操作时,交换当前出队节点的两个入队左右节点位置。
总结
比较简单
代码
class Solution {
public TreeNode invertTree(TreeNode root) {
if (root==null) return root;
TreeNode temp=new TreeNode();
temp=root.left;
root.left=root.right;
root.right=temp;
invertTree(root.left);
invertTree(root.right);
return root;
}
}
101.对称二叉树
思路
1.做了翻转二叉树,对称二叉树只需翻转一侧的树,就可以使两颗子树相同。那么只需将其中一颗子树翻转,并比较两个子树是否相同即可。题解代码更为巧妙return dfs(left.left,right.right) && dfs(left.right,right.left);
最后一行判断左子树的左节点与右子树的右节点,这样一来就不需要事先翻转了。
2.题解中也讲到了层序遍历来解题,不过须注意的是:队列的两个实现类LinkedList和ArrayDeque
前者可以入队null,后者不可以入队null。因此本题若要使用层序遍历解题,需要使用LinkedList类。这样一来每次出队列取出两个节点值比对,入队是分别从树的两端入队。(或传统层序判断每层List是否构成回文)
代码
递归
//比较两颗树是否相同
public static boolean isSameTree(TreeNode p, TreeNode q) {
if (p == null && q == null) {
return true;
}
if (p == null || q == null) {
return false;
}
if (p.val != q.val) {
return false;
}
//return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
return dfs(p.left,q.right) && dfs(p.right,q.left);
}
public boolean isSymmetric(TreeNode root) {
//invertTree(root.right);
if (isSameTree(root.left,root.right)) return true;
else return false;
}
队列(题解)
class Solution {
public boolean isSymmetric(TreeNode root) {
if(root==null || (root.left==null && root.right==null)) {
return true;
}
//用队列保存节点
LinkedList<TreeNode> queue = new LinkedList<TreeNode>();
//将根节点的左右孩子放到队列中
queue.add(root.left);
queue.add(root.right);
while(queue.size()>0) {
//从队列中取出两个节点,再比较这两个节点
TreeNode left = queue.removeFirst();
TreeNode right = queue.removeFirst();
//如果两个节点都为空就继续循环,两者有一个为空就返回false
if(left==null && right==null) {
continue;
}
if(left==null || right==null) {
return false;
}
if(left.val!=right.val) {
return false;
}
//将左节点的左孩子, 右节点的右孩子放入队列
queue.add(left.left);
queue.add(right.right);
//将左节点的右孩子,右节点的左孩子放入队列
queue.add(left.right);
queue.add(right.left);
}
return true;
}
}