OJ练习22——T101 Symmetric Tree

判断一颗二叉树是否是镜面(即轴对称)。

Leecode表示二叉树:

{1,#,2,3}

是层次遍历的结果,#表示节点为空。

【思路】

1.我的思路,镜面树一个特征,把左树的左右孩子都交换,就和右树完全一样。

所以另写两个函数,都使用递归,一个是判断两树是否相等。

2.别人的思路,用一个树的左树比较另一棵树的右树,右树比较左树(虽然很容易想到,但不太会实现递归)

bool isSymmetric(TreeNode *root) {
        if(root==NULL)
            return true;
        trans(root->left);
        return isSameTree(root->left,root->right);
    }
    void trans(TreeNode *root)
    {
        if(root&&(root->left||root->right))
        {
            TreeNode *temp=root->left;
            root->left=root->right;
            root->right=temp;
            trans(root->left);
            trans(root->right);
        }
        else return;
    }
    bool isSameTree(TreeNode *p, TreeNode *q)
    {
        if(!( (p && q && p->val==q->val) || (p==NULL && q==NULL))) return false;
        if(p==NULL || q==NULL) return true;
        return isSameTree(p->left,q->left) && isSameTree(p->right,q->right);
    }

【other code】

bool dfs(TreeNode *left,TreeNode *right)
    {
        if(!left && !right) return true;//需要先判断这个,不然val那个可能会出现RE
        if((left && !right) || (!left && right) || (left->val!=right->val)) return false;
        return dfs(left->left,right->right) && dfs(left->right,right->left);
    }
    bool isSymmetric(TreeNode *root) {
        if(root==NULL || (!root->left && !root->right)) return true;
        return dfs(root->left,root->right);
    }

【评价】

看人家的代码还是漂亮些,其实dfs还是判断两树是否相等。

我的那个trans还是写的挺好的O(∩_∩)O哈哈~

原文地址:https://www.cnblogs.com/ketchups-notes/p/4443650.html