题目描述
请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
思路:
做本题之前先了解二叉树镜像:https://blog.youkuaiyun.com/orangefly0214/article/details/83620497
考察对二叉树的理解,实质是利用树的遍历算法解决问题。树的对称是一个抽象的概念,我们可以通过画图将抽象问题具体化。
二叉树的三种遍历方法:前序遍历,中序遍历,后序遍历,这三种方法都是先遍历左子节点,再遍历右子节点。我们可以考虑定义一种遍历算法,先遍历右子节点,再遍历左子节点。比如我们定义一种与前序遍历对称的遍历算法,先遍历父节点,再遍历它的右子节点,再遍历它的左子节点。
这时我们用前序遍历和对称前序遍历算法得到的序列是一样的。
实现1:递归
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
boolean isSymmetrical(TreeNode pRoot)
{
return isSymmetrical(pRoot,pRoot);
}
private boolean isSymmetrical(TreeNode pRoot1,TreeNode pRoot2){
if(pRoot1==null&&pRoot2==null){
return true;
}
if(pRoot1==null||pRoot2==null){
return false;
}
if(pRoot1.val!=pRoot2.val){
return false;
}
return isSymmetrical(pRoot1.left,pRoot2.right)&&isSymmetrical(pRoot1.right,pRoot2.left);
}
}
实现2:非递归-堆栈或队列实现
非递归的方法:深度优先遍历。
DFS:采用stack来保存成对的节点。
1.出栈的时候也是成对的。
1).若都为空,继续。
2).一个为空,返回false。
3).不为空:比较当前值,值不等,返回false
2.确定入栈顺序,每次入栈都是成对的。如left.left, right.right ;left.rigth,right.left
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
import java.util.Stack;
public class Solution {
boolean isSymmetrical(TreeNode pRoot)
{
if(pRoot==null){
return true;
}
Stack<TreeNode> s=new Stack<>();
s.push(pRoot.left);
s.push(pRoot.right);
while(!s.isEmpty()){
TreeNode right=s.pop();
TreeNode left=s.pop();
if(left==null&&right==null) continue;
if(left==null||right==null) return false;
if(left.val!=right.val) return false;
//子节点成对入栈
s.push(left.left);
s.push(right.right);
s.push(left.right);
s.push(right.left);
}
return true;
}
}