剑指offer(28)
剑指offer(28)
剑指 Offer 28. 对称的二叉树
请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。
例如,二叉树 [1,2,2,3,4,4,3] 是对称的。
1 / \ 2 2 / \ / \3 4 4 3
但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:
1 / \ 2 2 \ \ 3 3
示例 1:
输入:root = [1,2,2,3,4,4,3]
输出:true
示例 2:
输入:root = [1,2,2,null,3,null,3]
输出:false
限制:
0 <= 节点个数 <= 1000
DFS 深度优先:
class Solution {
public:
//二叉树是否对称 就是判断左右子树是否对称
bool isSymmetric(TreeNode* root) {
//根节点为空 则对称
if(root==nullptr)return true;
//去比较它的左右子树
return check(root->left,root->right);
}
bool check(TreeNode* rootLeft,TreeNode* rootRight){
//两个结点 是否相同 不同就false 如果都是nullptr就返回true 都不为nullptr就继续判断
if(rootLeft==nullptr||rootRight==nullptr)return rootLeft==rootRight;
if(rootLeft->val!=rootRight->val)return false;
//对称 左子树的左节点应该等于右子树的右节点
return check(rootLeft->left,rootRight->right)&&check(rootLeft->right,rootRight->left);
}
};
BFS 广度优先:
这里给出官方题解,时间和空间复杂度都和DFS差不多
class Solution {
public:
bool check(TreeNode *u, TreeNode *v) {
queue <TreeNode*> q;//BFS核心数据结构
q.push(u); q.push(v);
while (!q.empty()) {
u = q.front(); q.pop();
v = q.front(); q.pop();
if (!u && !v) continue;
if ((!u || !v) || (u->val != v->val)) return false;
q.push(u->left);
q.push(v->right);
q.push(u->right);
q.push(v->left);
}
return true;
}
bool isSymmetric(TreeNode* root) {
//有趣的是首先放入的两个都是root
return check(root, root);
}
};
本文来自博客园,作者:{BailanZ},转载请注明原文链接:https://www.cnblogs.com/BailanZ/p/16201886.html