0
点赞
收藏
分享

微信扫一扫

《剑指offer刷题笔记》27、对称的二叉树【c++详细题解】

题目

请实现一个函数,用来判断一棵二叉树是不是对称的。

如果一棵二叉树和它的镜像一样,那么它是对称的。

样例

如下图所示二叉树[1,2,2,3,4,4,3,null,null,null,null,null,null,null,null]为对称二叉树:
1
/ \
2 2
/ \ / \
3 4 4 3

如下图所示二叉树[1,2,2,null,4,4,3,null,null,null,null,null,null]不是对称二叉树:
1
/ \
2 2
\ / \
4 4 3

思路

(二叉树,递归)《剑指offer刷题笔记》27、对称的二叉树【c++详细题解】_时间复杂度
递归判断两个子树是否互为镜像。

两个子树互为镜像当且仅当:

  1. 两个子树的根节点值相等;
  2. 第一棵子树的左子树和第二棵子树的右子树互为镜像,且第一棵子树的右子树和第二棵子树的左子树互为镜像;

时间复杂度
从上到下每个节点仅被遍历一遍,所以时间复杂度是 《剑指offer刷题笔记》27、对称的二叉树【c++详细题解】_时间复杂度

代码

/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
bool isSymmetric(TreeNode* root) {
if(!root) return true; //根节点为空,返回true
return dfs(root->left,root->right);//判断两棵子树是否互为镜像
}
bool dfs(TreeNode* p,TreeNode* q){
if(!p && !q) return true; //两个结点都为空
else if (!p||!q) return false; //只有一个为空
if(p->val!=q->val) return false;
//第一棵子树的左子树和第二棵子树的右子树互为镜像,且第一棵子树的右子树和第二棵子树的左子树互为镜像;
return dfs(p->left,q->right)&&dfs(p->right,q->left);
}
};


举报

相关推荐

0 条评论