博客 / 詳情

返回

劍指offer-58、對稱二叉樹

題⽬描述

請實現⼀個函數,⽤來判斷⼀棵⼆叉樹是不是對稱的。注意,如果⼀個⼆叉樹同此⼆叉樹的鏡像是同樣
的,定義其為對稱的。

例如:下⾯這棵⼆叉樹是對稱的

下⾯這個就不是對稱的:

示例1

輸⼊:{8,6,6,5,7,7,5}
返回值:true

示例2:

輸⼊:{8,6,9,5,7,7,5}
返回值:false

思路及解答

遞歸

遞歸,先判斷根節點是否為空,不為空則判斷左右⼦樹是不是對稱。

如果左右⼦樹都為空,則返回 true ,如果有⼀個為空,則返回 false ,如果兩個都不為空的時候,除了對⽐左右兩個節點的值,還需要遞歸,對⽐左⼦樹的左⼦樹和右⼦樹的右⼦樹是否相等,左⼦樹的右⼦樹和右⼦樹的左⼦樹是否相等。

public class Solution {
    public boolean jude(TreeNode left, TreeNode right) {
        // 如果左右兩個都為空,則對稱
        if (left == null && right == null) {
            return true;
        } else if (left == null || right == null) {
            // 如果左右兩個有⼀個為空,那麼就不對稱
            return false;
        }
        
        // 都不為空的情況,需要判斷兩個的值,是不是相等
        if (left.val != right.val) {
            return false;
        } else {
            // 遞歸判斷,左⼦樹的左⼦樹和右⼦樹的右⼦樹,左⼦樹的右⼦樹和右⼦樹的左⼦樹
            return jude(left.left, right.right) && jude(left.right, right.left);
        }
    }
    
    public boolean isSymmetrical(TreeNode pRoot) {
        // 判斷根節點是否為空,如果不為空則判斷左右⼦樹
        return pRoot==null || jude(pRoot.left, pRoot.right);
    }
}
  • 時間複雜度:O(n)
  • 空間複雜度:O(n),最壞情況下,⼆叉樹退化為鏈表

迭代

是藉助兩個隊列,按照層次,⼀個是按照從左到右添加元素,另外⼀個隊列
是按照從右到左添加元素,挨個取出來,進⾏對⽐,不等則説明不對稱,如果相等,則再把其左右⼦樹
分別按照不同的順序添加到隊列中。代碼如下

public class Solution {
    /**
    * 迭代法
     * 使用雙端隊列,相當於兩個棧
     */
    public boolean isSymmetric2(TreeNode root) {
        Deque<TreeNode> deque = new LinkedList<>();
        deque.offerFirst(root.left);
        deque.offerLast(root.right);
        while (!deque.isEmpty()) {
            TreeNode leftNode = deque.pollFirst();
            TreeNode rightNode = deque.pollLast();
            if (leftNode == null && rightNode == null) {
                continue;
            }

            if (leftNode == null || rightNode == null || leftNode.val != rightNode.val) {
                return false;
            }
            deque.offerFirst(leftNode.left);
            deque.offerFirst(leftNode.right);
            deque.offerLast(rightNode.right);
            deque.offerLast(rightNode.left);
        }
        return true;
    }

    /**
     * 迭代法
     * 使用普通隊列
     */
    public boolean isSymmetric3(TreeNode root) {
        Queue<TreeNode> deque = new LinkedList<>();
        deque.offer(root.left);
        deque.offer(root.right);
        while (!deque.isEmpty()) {
            TreeNode leftNode = deque.poll();
            TreeNode rightNode = deque.poll();
            if (leftNode == null && rightNode == null) {
                continue;
            }

            if (leftNode == null || rightNode == null || leftNode.val != rightNode.val) {
                return false;
            }
            // 這裏順序與使用Deque不同
            deque.offer(leftNode.left);
            deque.offer(rightNode.right);
            deque.offer(leftNode.right);
            deque.offer(rightNode.left);
        }
        return true;
    }
}
  • 空間複雜度為 O(n)
  • 時間複雜度為 O(n) ,每個節點只會⼊隊出隊⼀次。
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.