題目內容
給定一個二叉樹,檢查它是否是鏡像對稱的。
例如,二叉樹 [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 生成二叉樹代碼.