给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [1,2,2,3,4,4,3] 是对称的。

image.png
但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:

image.png
法一:递归调用
class Solution {
public boolean isSymmetric(TreeNode root) {
//递归
if(root==null)
return true;
//空节点是特殊二叉树
return dfs(root.left,root.right);
}
public boolean dfs(TreeNode p,TreeNode q){
//当有一个为空,另一个必须也为空
if(p==null || q==null)
return (p==null)&&(q==null);
//左边往左走右边就得往右走以求对称
//一旦有一点不对称立即返回false
return p.val==q.val && dfs(p.left,q.right) && dfs(p.right,q.left);
}
}
法二:迭代法
(利用94题的中序遍历【LDR】的步骤,左边一样,右边反着来)
(94题是开一个栈,将tree.left的结点(1、2、4、8)压入栈,等right遍历完就pop)
先放一个94题的代码
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
//先画出一棵深度为4的树以帮助理解记忆
//建立一个栈,将tree.left(1、2、4、8···)压入栈,每次取出
//将排序好的放入链表中,最后返回链表
List <Integer> res = new ArrayList<>();
Stack <TreeNode>stack=new Stack<>();
TreeNode p=root;
while(p!=null || !stack.isEmpty()){
while(p!=null){
stack.push(p);
p=p.left;
}
p=stack.pop();
res.add(p.val);
p=p.right;
}
return res;
}
}
接下来回归正题101
这次要建立两个栈分别用来存左边和右边的节点
class Solution {
public boolean isSymmetric(TreeNode root) {
//递归
if(root==null)
return true;
Stack <TreeNode> stkleft=new Stack<>();
Stack <TreeNode> stkright=new Stack<>();
TreeNode l=root.left, r=root.right;
while(l!=null || r!=null || !stkleft.empty() || !stkright.empty()){
while( (l!=null) && (r!=null) ){
stkleft.push(l);
stkright.push(r);
l=l.left;
r=r.right;
}
//结束循环之后一个空一个不空就返回false
if(l!=null || r!=null)
return false;
//成功的话要给l和r赋值,并把使用过的点pop出来
l=stkleft.pop();
r=stkright.pop();
if(l.val!=r.val)
return false;
//否则的话,把l的左子树加进来,r的右子树加进来
l=l.right;
r=r.left;
}
return true;
}
}
迭代还可以用队列的方法······