【LeetCode】101. Symmetric Tree 解题报告

来源:互联网 发布:jordan淘宝官方旗舰店 编辑:程序博客网 时间:2024/05/17 07:26

转载请注明出处:http://blog.csdn.net/crazy1235/article/details/51541984


Subject

出处:https://leetcode.com/problems/symmetric-tree/


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;    }

传送门

【Same Tree】

【Reverse Binary Tree】


bingo~~

1 0