给你一颗二叉树,判断是否是对称二叉树
样例
例1:
输入:{1,2,2,3,4,4,3}
输出:true
说明:
1
/ \
2 2
/ \ / \
3 4 4 3
是一个对称的二叉树。
例2:
输入:{1,2,2,#,3,#,3}
输出:false
说明:
1
/ \
2 2
\ \
3 3
不是对称的二叉树。
挑战
你能递归地和迭代地解决它吗?
解题思路1:
递归。类似于Lintcode 469. Same Tree
node1的左子树是否等于node2的右子树 && node1的右子树是否等于node2的左子树
/**
* Definition of TreeNode:
* public class TreeNode {
* public int val;
* public TreeNode left, right;
* public TreeNode(int val) {
* this.val = val;
* this.left = this.right = null;
* }
* }
*/
public class Solution {
/**
* @param root: the root of binary tree.
* @return: true if it is a mirror of itself, or false.
*/
public boolean isSymmetric(TreeNode root) {
// write your code here
if(root == null)
return true;
return helper(root.left, root.right);
}
private boolean helper(TreeNode nodeLeft, TreeNode nodeRight){
if(nodeLeft == null && nodeRight == null)
return true;
else if(nodeLeft == null || nodeRight == null)
return false;
if(nodeLeft.val != nodeRight.val)
return false;
return helper(nodeLeft.left, nodeRight.right) && helper(nodeLeft.right, nodeRight.left);
}
}
解题思路2:
非递归BFS使用Queue来保存成对的节点
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.*;
public class Solution {
boolean isSymmetrical(TreeNode root){
if(root == null)
return true;
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root.left);
queue.offer(root.right);
while(!queue.isEmpty()){
//成对取出
TreeNode node1 = queue.poll();
TreeNode node2 = queue.poll();
if(node1 == null && node2 == null)
continue;
if(node1 == null || node2 == null)
return false;
if(node1.val != node2.val)
return false;
//成对插入
queue.offer(node1.left);
queue.offer(node2.right);
queue.offer(node1.right);
queue.offer(node2.left);
}
return true;
}
}