LeetCode题解:Symmetric Tree(有4种解法)

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

题解:

判断一棵二叉树是否是自身的镜像,即:一棵爱美的二叉树去照镜子,发现镜子里的自己竟然和自己长得一样诶!!!

文字看不懂的话,就看看题目给的Example咯 -..-

解题思路:

这道题其实有很多的思路,我都列出来吧:

1、我看到这道题的想法是这样的:一棵有左右孩子,而且非空的二叉树,对它的左孩子进行层次遍历,并把结果存起来;对它的右孩子进行逆序的层次遍历(每一层从右到左遍历),并把结果存起来。最后把左右孩子进行对比。显然这个方法是比较笨的 -..-

2、把所有左子树和“镜像”对应的右子树进行对比,不断的递归。如果每一次对比返回的结果都是true,则是镜像二叉树。

3、中序遍历,思路和1、差不多

4、分别遍历根节点的左右子树,获得一个字符串。然后对比。

代码:

这里的代码呢我都是以LeetCode上先发出来的大神的代码为主,主要是考虑到LeetCode上有人会因为代码思想相似给人Vote Down,所以我也本着不鼓励重复发明轮子的思想,在这贴上首发的大神们的代码。反正都是学习嘛,都OK啦。

1、by:lucastan

#include<queue>
using namespace std;
typedef pair<TreeNode*,TreeNode*> nodepair;
class Solution {
public:
    bool isSymmetricRecursive(TreeNode*a,TreeNode*b){
        if(a){
            return b && a->val==b->val && 
                isSymmetricRecursive(a->left,b->right) &&
                isSymmetricRecursive(a->right,b->left);
        }
        return !b;
    }
    bool isSymmetricRecursive(TreeNode*root){
        return !root || isSymmetricRecursive(root->left,root->right);
    }
    bool isSymmetric(TreeNode *root) {
        // Level-order BFS.
        queue<nodepair> q;
        if(root)
            q.push(make_pair(root->left,root->right));
        while(q.size()){
            nodepair p=q.front(); q.pop();
            if(p.first){
                if(!p.second)return false;
                if(p.first->val != p.second->val) return false;
                // the order of children pushed to q is the key to the solution.
                q.push(make_pair(p.first->left,p.second->right));
                q.push(make_pair(p.first->right,p.second->left));
            }
            else if(p.second) return false;
        }
        return true;
    }
};

2、by:lzklee

 public boolean checkSymmetric(TreeNode lsubTree,TreeNode rsubTree){
    if(lsubTree==null&&rsubTree==null) return true;
    else if(lsubTree!=null&&rsubTree==null) return false;
    else if(lsubTree==null&&rsubTree!=null) return false;
    else if(lsubTree.val!=rsubTree.val) return false;
    boolean lt=checkSymmetric(lsubTree.left,rsubTree.right);
    boolean rt=checkSymmetric(lsubTree.right,rsubTree.left);
    return lt&&rt;
}
public boolean isSymmetric(TreeNode root) {
    if(root==null) return true;
    return checkSymmetric(root.left,root.right);
} public boolean checkSymmetric(TreeNode lsubTree,TreeNode rsubTree){
    if(lsubTree==null&&rsubTree==null) return true;
    else if(lsubTree!=null&&rsubTree==null) return false;
    else if(lsubTree==null&&rsubTree!=null) return false;
    else if(lsubTree.val!=rsubTree.val) return false;
    boolean lt=checkSymmetric(lsubTree.left,rsubTree.right);
    boolean rt=checkSymmetric(lsubTree.right,rsubTree.left);
    return lt&&rt;
}
public boolean isSymmetric(TreeNode root) {
    if(root==null) return true;
    return checkSymmetric(root.left,root.right);
}
3、 by: walnutown

<span style="font-size:12px;">public class Solution {
    ArrayList<String> nodeArr;

    public boolean isSymmetric(TreeNode root) {
        // Start typing your Java solution below
        // DO NOT write main() function
        if (root == null){
            return true;
        }
        nodeArr = new ArrayList<String>();
        inorderTraversal(root);

    // compare in-order traversal list
        int i = 0;
        int j = nodeArr.size() -1;
        while (i < j){
            if (!nodeArr.get(i).equals(nodeArr.get(j))){
                return false;
            }
            i++;
            j--;
        }
        return true;      
    }

    public void inorderTraversal(TreeNode n){
    // if empty node, save as ‘#’ to occupy this place
        if (n == null){
            nodeArr.add("#");
            return;
        }
        if (n.left == null && n.right == null) {
            nodeArr.add(""+n.val);
        } else {
            inorderTraversal(n.left);
            nodeArr.add(""+n.val);
            inorderTraversal(n.right);
        }
    }
}</span>
4、by: cow12331
public boolean isSymmetric(TreeNode root) {
    return left(root).equals(right(root));
}

public static String left(TreeNode root) {
    if(root == null) return "#";
    else {
        return root.val + left(root.left) + left(root.right);
    }
} 

public static String right(TreeNode root) {
    if(root == null) return "#";
    else {
        return root.val + right(root.right) + right(root.left);
    }
} 







你可能感兴趣的:(LeetCode题解:Symmetric Tree(有4种解法))