方法一:递归:
思路:
(1)若树为空,直接返回true。否则调用判断左右子树是否对称的函数isSymmetricTree(root.left, root.right)。
(2)判断左右子树是否对称:若左右子树均为空,直接返回true;否则若左右子树有一棵树为空,直接返回false;否则判断左右子树的根节点的值是否相等,再判断左子树的右子树与右子树的左子树是否对称以及左子树的左子树与右子树的右子树是否对称。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public boolean isSymmetric(TreeNode root) {
if (root == null)
return true;
return isSymmetricTree(root.left, root.right);
}
public boolean isSymmetricTree(TreeNode left, TreeNode right) {
if (left == null && right == null)
return true;
else if (left == null || right == null)
return false;
else
return left.val == right.val && isSymmetricTree(left.right, right.left) && isSymmetricTree(left.left, right.right);
}
}
Rumtime:1ms
方法二:栈操作
思路:
(1)若树为空,直接返回true。
(2)先把根节点的左孩子放入栈stack1,再把根节点的右孩子放入栈stack2。
(3)只要栈stack1不为空,就弹出两个栈的栈顶节点,若两个节点都为空,则继续循环;若一个节点为空而另一个节点不为空或两个节点的值不相等,则返回false。再把左子树的左子节点、右子节点和右子树的右子节点、左边子节点依次压入栈。
(4)栈为空时,返回true。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public boolean isSymmetric(TreeNode root) {
if (root == null)
return true;
Stack<TreeNode> stack1 = new Stack<TreeNode>();
Stack<TreeNode> stack2 = new Stack<TreeNode>();
stack1.push(root.left);
stack2.push(root.right);
while (!stack1.isEmpty() ) {
TreeNode p = stack1.pop();
TreeNode q = stack2.pop();
if (p == null && q == null)
continue;
if (p == null || q == null || p.val != q.val)
return false;
stack1.push(p.left);
stack1.push(p.right);
stack2.push(q.right);
stack2.push(q.left);
}
return true;
}
}
Rumtime:3ms
方法三:队列操作
思路:
(1)若树为空,直接返回true。
(2)先把根节点的左孩子放入队列queue1,再把根节点的右孩子放入队列queue2。
(3)只要队列queue1不为空,就弹出两个队列的头节点,若两个节点都为空,则继续循环;若一个节点为空而另一个节点不为空或两个节点的值不相等,则返回false。再把左子树的左子节点、右子节点和右子树的右子节点、左边子节点依次压入队列。
(4)队列为空时,返回true。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public boolean isSymmetric(TreeNode root) {
if (root == null)
return true;
Queue<TreeNode> queue1=new LinkedList<TreeNode>();
Queue<TreeNode> queue2=new LinkedList<TreeNode>();
queue1.add(root.left);
queue2.add(root.right);
while (!queue1.isEmpty() ) {
TreeNode p = queue1.poll();
TreeNode q = queue2.poll();
if (p == null && q == null)
continue;
if (p == null || q == null || p.val != q.val)
return false;
queue1.add(p.left);
queue1.add(p.right);
queue2.add(q.right);
queue2.add(q.left);
}
return true;
}
}
Rumtime:2ms