判断二叉树是否对称

96 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 1天

题目链接: www.nowcoder.com/practice/ff…

描述

给定一棵二叉树,判断其是否是自身的镜像(即:是否对称)

数据范围:节点数满足 0 \le n \le 10000≤n≤1000,节点上的值满足 |val| \le 1000∣val∣≤1000

要求:空间复杂度 O(n)O(n),时间复杂度 O(n)O(n)

备注:

你可以用递归和迭代两种方法解决这个问题

示例1

输入:

{1,2,2,3,4,4,3}

复制

返回值:

true

复制

示例2

输入:

{8,6,9,5,7,7,5}

复制

返回值:

false

思路: 用递归,每次递归用两个指针分别保存左右子树,然后递归,判断每个结点的左右子树的值是否相同。

具体实现:

struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};
*/
class Solution {
public:
    bool isSymmetrical(TreeNode* pRoot) 
    {
        if(pRoot)
        {
        if(pRoot->left||pRoot->right)
        {
       TreeNode* pleft = pRoot->left;
       TreeNode* pright = pRoot->right;
       isSymmetrical(pleft);
       isSymmetrical(pright);
       if(pleft->val == pright->val) return true;
       else return false;
        }
        else return true;
        }
        else return true;
    }

};

小结

这种思路是错误的,题中并不要求所有结点的左右子树都相等,而是以根节点为对称轴的轴对称

正确思路:逻辑上将该树复制一份,拼接到一个虚假的父节点上,函数传入这个父节点的左子树和右子树判断是否相等

正确解法:

classSolution {

public:

   bool recursion(TreeNode* root1, TreeNode* root2){

     //可以两个都为空         if(root1 == NULL && root2 == NULL)

           return rue;         //只有一个为空或者节点值不同,必定不对称

       if(root1 == NULL || root2 == NULL || root1->val != root2->val)

            return false;         //每层对应的节点进入递归

       return recursion(root1->left, root2->right) && recursion(root1->right, root2->left);

   }

    bool isSymmetrical(TreeNode* pRoot) {

       return recursion(pRoot, pRoot);

   }

};