题干:
代码:
class Solution {
public:
bool compare(TreeNode* left, TreeNode* right){//传入左右子树
if(left == NULL && right != NULL) return false;//子
else if(left != NULL && right == NULL) return false;//子
else if(left == NULL && right == NULL) return true;//子
else if(left -> val != right -> val) return false;//子
bool inside = compare(left -> right, right -> left);//父
bool outside = compare(left -> left, right -> right);//父
bool res = inside && outside;//父
return res;
}
bool isSymmetric(TreeNode* root) {
bool res = compare(root -> left, root -> right);
return res;
}
};
某种意义上是后序遍历。
补充:迭代实现:
//实现二叉树是否对称的迭代方法,我们可以使用队列。基本思路是利用队列存储需要比较的节点,每次取出两个节点比较它们的值,然后按照镜像的方式将它们的子节点成对加入队列。以下是一个具体实现的示例:
#include <iostream>
#include <queue>
using namespace std;
// 定义二叉树节点结构
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
bool isSymmetric(TreeNode* root) {
if (root == NULL) return true;
// 使用队列来迭代处理
queue<TreeNode*> q;
// 初始时将根节点的左右子节点加入队列
q.push(root->left);
q.push(root->right);
while (!q.empty()) {
TreeNode* left = q.front();
q.pop();
TreeNode* right = q.front();
q.pop();
// 如果两个节点都为空,则继续下一轮比较,说明此时已经顺利遍历到叶子了
if (left == NULL && right == NULL) continue;
// 只要遍历过程中出现其中一个节点为空,或者两个节点的值不相等,则不对称,立刻返回false
if (!left || !right || left->val != right->val) return false;
// 将要比较的子节点成对加入队列
q.push(left->left);//外
q.push(right->right);//外
q.push(left->right);//内
q.push(right->left);//内
}
return true; // 能顺利完成while说明每一次都能顺利达到left == NULL && right == NULL,返回 true
}