1. 程式人生 > >【LeetCode】101. Symmetric Tree 解題報告

【LeetCode】101. Symmetric Tree 解題報告

Subject

Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).

For example, this binary tree is symmetric:

    1
   / \
  2   2
 / \ / \
3  4 4  3

But the following is not:

    1
   / \
  2   2
   \   \
   3    3

Explain

判斷一顆二叉樹是否 映象對稱

Solution

solution 1

判斷是否是映象對稱,重要的就是判斷對應位置的兩個結點的值是否相等。

方法一使用雙端佇列來實現。

    /**
     * 雙端佇列 <br />
     * DFS <br />
     * 3ms <br />
     * beats 6.29% of java submissions
     * 
     * @param root
     * @return
     */
    public boolean isSymmetric(TreeNode root) {
        if (root == null
) { return true; } Deque<TreeNode> deque = new LinkedList<TreeNode>(); deque.addFirst(root.left); deque.addLast(root.right); TreeNode preNode = null; TreeNode postNode = null; while (!deque.isEmpty()) { preNode = deque.pollFirst(); postNode = deque.pollLast(); if
(preNode == null && postNode == null) { continue; } if (preNode == null || postNode == null) { return false; } if (preNode.val != postNode.val) { return false; } else { deque.addFirst(preNode.right); deque.addFirst(preNode.left); deque.addLast(postNode.left); deque.addLast(postNode.right); } } return true; }

每次都是從隊頭和隊尾各poll出結點,然後進行比較。

如果條件滿足,將隊頭結點的右結點和左結點入隊頭
隊尾結點的左結點和右結點入隊尾
直到佇列為空

solution 2

遞迴方式

    /**
     * 遞迴方式 <br />
     * 1ms <br />
     * 
     * @param root
     * @return
     */
    public boolean isSysmmetric2(TreeNode root) {
        if (root == null) {
            return true;
        }

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

    public boolean checkNodes(TreeNode node1, TreeNode node2) {
        if (node1 == null && node2 == null) {
            return true;
        }
        if (node1 == null || node2 == null) {
            return false;
        }
        if (node1.val != node2.val) {
            return false;
        } else {
            return checkNodes(node1.left, node2.right)
                    && checkNodes(node1.right, node2.left);
        }
    }

該方法的效率較高~
1ms

solution 3

考慮到之前有做過一個【Same Tree】 的題目和 【Reverse Binary Tree】 的題目。
所以想到,將當前二叉樹“反轉”,然後在判斷這兩個樹是否一樣即可。

    /**
     * 拷貝一顆二叉樹,reverse。或者拷貝的時候直接反轉。 <br />
     * 然後在使用Same Tree的方法判斷這兩個樹是否一樣。 <br />
     * 1ms
     * 
     * @param root
     * @return
     */
    public boolean isSysmmetric3(TreeNode root) {
        if (root == null) {
            return true;
        }

        TreeNode newRootNode = copyNode(root);

        SameTree sameTree = new SameTree();
        return sameTree.isSameTree(root, newRootNode);
    }

    /**
     * 左右對換結點拷貝二叉樹
     * 
     * @param node
     * @return
     */
    private TreeNode copyNode(TreeNode node) {
        if (node == null) {
            return null;
        }
        TreeNode treeNode = new TreeNode(node.val);
        treeNode.left = copyNode(node.right);
        treeNode.right = copyNode(node.left);
        return treeNode;
    }

bingo~~