题目内容
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [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 class Solution {
public bool IsSymmetric(TreeNode root)
{
if (root == null) return true;
//验证左右节点是否镜像对称
return IsSymmetric(root.left, root.right);
}
private static bool IsSymmetric(TreeNode x, TreeNode y)
{
//判断两个节点的值是是否一致
if (x == null) return y == null;
if (y == null) return false;
//递归验证子节点值是否一致
return x.val == y.val
//对比两个节点是否镜像对称【[①]②③[④]】
&& IsSymmetric(x.left, y.right)
//对比两个节点是否镜像对称【①[②][③]④】
&& IsSymmetric(x.right, y.left);
}
}
实现方式二(迭代实现)
/**
* 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 class Solution {
public bool IsSymmetric(TreeNode root)
{
if (root == null) return true;
//创建存储需要迭代的节点的队列
var queue = new Queue<TreeNode>();
//存入左右节点
queue.Enqueue(root.left);
queue.Enqueue(root.right);
while (queue.Any())
{
//取出两个需要对比的节点
var x = queue.Dequeue();
var y = queue.Dequeue();
//判断两个节点值是否一致
if (x == null)
{
if (y == null) continue;
return false;
}
if (y == null || x.val != y.val) return false;
//存入两个节点的子节点
//对比两个节点是否镜像对称【[①]②③[④]】
queue.Enqueue(x.left);
queue.Enqueue(y.right);
//对比两个节点是否镜像对称【①[②][③]④】
queue.Enqueue(y.left);
queue.Enqueue(x.right);
}
return true;
}
}
根据 [1,2,2,null,3,null,3] 生成TreeNode: LeetCode 生成二叉树代码.