剑指offer(C++)-JZ28:对称的二叉树(数据结构-树)
Posted 翟天保Steven
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer(C++)-JZ28:对称的二叉树(数据结构-树)相关的知识,希望对你有一定的参考价值。
作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处
题目描述:
给定一棵二叉树,判断其是否是自身的镜像(即:是否对称)
例如: 下面这棵二叉树是对称的
下面这棵二叉树不对称。
数据范围:节点数满足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);
;
以上是关于剑指offer(C++)-JZ28:对称的二叉树(数据结构-树)的主要内容,如果未能解决你的问题,请参考以下文章