給定一個二叉樹,檢查它是否是鏡像對稱的。
例如,二叉樹 [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) {
return root==null||isSymmetric(root.left,root.right);
}
public boolean isSymmetric(TreeNode left,TreeNode right){
if(left==null||right==null){
return left==right;
}
if(left.val!=right.val){
return false;
}
return isSymmetric(left.left,right.right)&&isSymmetric(left.right,right.left);
}
}
迭代思路
對左子樹進行先序遍歷,先將左子樹節點加入棧,在彈出,之后把右孩子加入棧中,左孩子加入棧中,而對于右子樹節點加入棧,再彈出,之后把左孩子加入棧中,有孩子加入棧中,分別對左右子樹遍歷節點,進行比較
class Solution {
public boolean isSymmetric(TreeNode root) {
if(root==null){
return true;
}
TreeNode left=root.left;
TreeNode right=root.right;
Stack<TreeNode> s1=new Stack<TreeNode>();
Stack<TreeNode> s2=new Stack<TreeNode>();
s1.push(left);
s2.push(right);
while(!s1.empty()&&!s2.empty()){
TreeNode left1=s1.pop();
TreeNode right1=s2.pop();
if(left1!=null&&right1!=null){
if(left1.val!=right1.val){
return false;
}else{
if(left1.right!=null){
s1.push(left1.right);
}else{
s1.push(null);
}
if(left1.left!=null){
s1.push(left1.left);
}else{
s1.push(null);
}
if(right1.left!=null){
s2.push(right1.left);
}else{
s2.push(null);
}
if(right1.right!=null){
s2.push(right1.right);
}else{
s2.push(null);
}
}
}else if(left1==null&&right1!=null){
return false;
}else if(left1!=null&&right1==null){
return false;
}else if(left1==null&&right1==null){
}
}
return true;
}
}