题目描述:
给定一棵二叉树,判断其是否是自身的镜像(即:是否对称)
例如: 下面这棵二叉树是对称的
下面这棵二叉树不对称。
数据范围:节点数满足0≤n≤1000,节点上的值满足∣val∣≤1000
要求:空间复杂度 O(n)O(n),时间复杂度 O(n)O(n)
备注:
你可以用递归和迭代两种方法解决这个问题
示例:
输入:
{1,2,2,3,4,4,3}
返回值:
true
解题思路:
本题考察数据结构树的使用。当根节点为空时,对称;比较左子树和右子树,若左子树存在右子树不存在,则不对称;若左子树不存在右子树存在,则不对称;若左右子树均不存在,则对称;若左子树根值不等于右子树根植,则不对称;递归,继续将左子树的左子树和右子树的右子树比较,将左子树的右子树和右子树的左子树比较。完毕。
测试代码:
/* 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) return true; // 根节点的左右子树进行比较 return Compare(pRoot->left,pRoot->right); } // 比较函数 bool Compare(TreeNode* left,TreeNode* right){ // 若左子树存在右子树不存在,则不对称;若左子树不存在右子树存在,则不对称 if((!left&&right)||(left&&!right)) return false; // 若左右子树均不存在,则对称 if(!left&&!right) return true; // 若左子树根值不等于右子树根植,则不对称 if(left->val!=right->val) return false; // 递归:将左子树的左子树和右子树的右子树比较,将左子树的右子树和右子树的左子树比较 return Compare(left->left,right->right)&&Compare(left->right,right->left); } };