对称二叉树
问题描述
给你一个二叉树的根节点 root , 检查它是否轴对称。
样例输入
cpp
root = [1,2,2,3,4,4,3]
样例输出
cpp
true
评测用例规模与约定
树中节点数目在范围 [1, 1000] 内
-100 <= Node.val <= 100
解析
要判断一棵二叉树是否对称,我们需要比较树的左右子树是否互为镜像。具体来说:
两个根节点具有相同的值
每个树的右子树都与另一个树的左子树镜像对称
我们可以使用递归或迭代的方法来解决这个问题。
递归方法
递归地比较左右子树:
左子树的左孩子与右子树的右孩子比较
左子树的右孩子与右子树的左孩子比较
迭代方法
使用队列或栈来迭代地比较节点:
将根节点的左右子节点入队两次
每次取出两个节点比较
将一个节点的左子节点和另一个节点的右子节点入队
将一个节点的右子节点和另一个节点的左子节点入队
参考程序
cpp
//递归
class Solution {
public:
bool isSymmetric(TreeNode* root) {
if (!root) return true;
return isMirror(root->left, root->right);
}
bool isMirror(TreeNode* left, TreeNode* right) {
if (!left && !right) return true;
if (!left || !right) return false;
return (left->val == right->val)
&& isMirror(left->left, right->right)
&& isMirror(left->right, right->left);
}
};
//迭代
class Solution {
public:
bool isSymmetric(TreeNode* root) {
if(root==nullptr)return true;
queue<TreeNode*>q;
q.push(root->left);
q.push(root->right);
while(!q.empty()){
TreeNode* l=q.front();q.pop();
TreeNode* r=q.front();q.pop();
if(!l&&!r)continue;
if(!l||!r)return false;
if(l->val!=r->val)return false;
q.push(l->left);
q.push(r->right);
q.push(l->right);
q.push(r->left);
}
return true;
}
};
难度等级
⭐️⭐️⭐️(1~10星)
以个人刷题整理为目的,如若侵权,请联系删除~