给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [1,2,2,3,4,4,3] 是对称的。
1 / \ 2 2 / \ / \ 3 4 4 3
但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:
1 / \ 2 2 \ \ 3 3
迭代的方式
/**
* Definition for a binary tree node.
* public class TreeNode {
* public int val;
* public TreeNode left;
* public TreeNode right;
* public TreeNode(int x) { val = x; }
* }
*/
public bool IsSymmetric(TreeNode root) {
if(root == null) return true;
//两条队列
Queue<TreeNode> left = new Queue<TreeNode>();
Queue<TreeNode> right = new Queue<TreeNode>();
left.Enqueue(root.left);
right.Enqueue(root.right);
while(left.Count > 0 && left.Count == right.Count)
{
//保证左边的结点,对上的是右边的结点
TreeNode l = left.Dequeue();
TreeNode r = right.Dequeue();
if(l == null && r == null) continue;
if(l == null || r == null) return false;
if(l.val == r.val)
{
left.Enqueue(l.left);//左边的先左后右
left.Enqueue(l.right);
right.Enqueue(r.right);//右边的先右后左
right.Enqueue(r.left);
}
else
{
return false;
}
}
return left.Count == right.Count;
}递归的方式:
public class Solution {
public bool IsSymmetric(TreeNode root) {
return IsSymmetric(root,root);
}
public bool IsSymmetric(TreeNode one,TreeNode two)
{
//前两个判断可以保证one和two都不为null
if(one == null && two == null) return true;
if(one == null || two == null) return false;
return (one.val == two.val) && IsSymmetric(one.left,two.right) && IsSymmetric(one.right,two.left);
}
}