劍指Offer題目:對稱的二叉樹

劍指Offer題目:對稱的二叉樹

題目描述
請實現一個函數,用來判斷一顆二叉樹是不是對稱的。注意,如果一個二叉樹同此二叉樹的鏡像是同樣的,定義其爲對稱的。


解題思路

思路:
(1) 遞歸。根結點的左右子結點值相同,同時左子結點的左子結點和右子結點的右子結點值相同,左子結點的右子結點和右子結點的左子結點值相同即可。
(2)也可以採用非遞歸思路,利用隊列或者棧實現。


完整代碼

public class q59_isSymmetrical_對稱的二叉樹 {

    //遞歸方法
    boolean isSymmetrical1(TreeNode pRoot) {
        if (pRoot == null) return true;
        return isSym(pRoot.left, pRoot.right);
    }

    private boolean isSym(TreeNode left, TreeNode right) {
        if (left == null && right == null) return true;
        if (left == null || right == null) return false;
        if (left.val != right.val) return false;
        return isSym(left.right, right.left) && isSym(left.left, right.right);
    }

    //非遞歸方法
    boolean isSymmetrical2(TreeNode pRoot) {
        {
            if (pRoot == null) return true;
            LinkedList<TreeNode> queue = new LinkedList();
            queue.offer(pRoot.left);
            queue.offer(pRoot.right);
            while (queue.size() != 0) {
                TreeNode left = queue.poll();
                TreeNode right = queue.poll();
                if (left == null && right != null) return false;
                if (left != null && right == null) return false;
                if (left != null && right != null) {
                    if (left.val != right.val) return false;
                    queue.offer(left.left);
                    queue.offer(right.right);
                    queue.offer(left.right);
                    queue.offer(right.left);
                }
            }
            return true;
        }
    }
}

更多LeetCode題目及答案解析見GitHub: https://github.com/on-the-roads/LeetCode
劍指offer題目及答案解析:https://github.com/on-the-roads/SwordToOffer

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