【LeetCode每週一題】對稱的樹

Hi,大家好~又到了每週一的LeetCode時間了~這周我們繼續來看一道樹結構的題目——對稱二叉樹。該題與上週的題目相同,考察的也是對於樹的遍歷的理解。同樣,我們也將使用遞歸和迭代的兩種方法解決。

描述

給定一個二叉樹,檢查它是否是鏡像對稱的。

例如,二叉樹[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

解法一

首先,我們先講講遞歸的解法。每次調用IsSymmetricNodes方法時判斷left以及right兩個結點是否相同,若不同則該樹不是對稱的樹;若左右結點相同,則繼續調用IsSymmetricNodes方法判斷下一層的子結點,即判斷左結點的左子結點與右結點右子結點,以及左結點的右子結點與右結點左子結點。

public bool IsSymmetricNodes(TreeNode left, TreeNode right) {
    if (left == null && right == null)
    {
        return true;
    }

    if (left == null || right == null || left.val != right.val)
    {
        return false;
    }

    return IsSymmetricNode(left.left, right.right) && IsSymmetricNode(left.right, right.left);
}

public bool IsSymmetric(TreeNode root) {
    if (root == null)
    {
        return true;
    }

    return IsSymmetricNodes(root.left, root.right);
}

解法二

使用迭代法時同樣需要額外的空間用於存放子結點。在每次迭代的循環中,取出對應的左右結點進行進行比較,若若不同則該樹不是對稱的樹;若左右結點相同,則繼續將左結點的左子結點與右結點右子結點,以及左結點的右子結點與右結點左子結點存放入輔助空間中繼續下一輪循環。

public bool IsSymmetric(TreeNode root) {
    Queue<TreeNode> queue = new Queue<TreeNode>();
    TreeNode left, right;

    if (root == null) {
        return true;
    }

    queue.Enqueue(root.left);
    queue.Enqueue(root.right);

    while (queue.Count() > 0) {
        left = queue.Dequeue();
        right = queue.Dequeue();

        if (left == null && right == null) {
            continue;
        }

        if (left == null || right == null || left.val != right.val) {
            return false;
        }

        queue.Enqueue(left.left);
        queue.Enqueue(right.right);

        queue.Enqueue(left.right);
        queue.Enqueue(right.left);
    }

    return true;
}

結束語

對稱的樹也是一個關於樹結構難度較低的題目,大家可以在相同的樹的基礎上繼續練習以掌握樹遍歷的知識。

今天的內容就到這裏啦,我們下週再見👋~

歡迎大家關注我的公衆號“風紙”,或是掃下面的二維碼關注👇
風紙

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章