判断A的右子树和B的左子树是否对称
判断A的左子树和B的右子树是否对称
递归终止条件
1. 都为空指针,返回true
2. 只有一个为空,返回false
3. 两个指针当前节点值不相等,返回false
/**
* 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) {
bool res = true;
if(root != nullptr) res = func(root->left,root->right);
return res;
}
bool func(TreeNode*A, TreeNode* B)
{
// 先写递归终止条件
if (A==NULL && B==NULL)
return true;
// 如果其中之一为空,也不是对称的
if (A==NULL || B==NULL)
return false;
// 走到这里二者一定不为空
if (A->val != B->val)
return false;
// 前序遍历
return func(A->left,B->right) && func(A->right,B->left);
}
};
使用队列进行迭代,两个相邻的节点应该相等,入队是先把左子树的左孩子,右子树的右孩子入队;再将左子树的右孩子,右子树的左孩子入队;第一次入队元素为根节点的左右节点
/**
* 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 ==NULL)
return true;
//用队列保存节点
queue<TreeNode*> q;
//将根节点的左右孩子放到队列中
q.push(root->left);
q.push(root->right);
while(!q.empty())
{
//从队列中取出两个节点,再比较这两个节点
TreeNode* A = q.front();
q.pop();
TreeNode* B = q.front();
q.pop();
//如果两个节点都为空就继续循环,两者有一个为空就返回false
if (A==NULL && B==NULL)
continue;
if (A==NULL || B==NULL)
return false;
if (A->val != B->val)
return false;
//将左子树的左孩子, 右子树的右孩子放入队列
q.push(A->left);
q.push(B->right);
//将左子树的右孩子,右子树的左孩子放入队列
q.push(A->right);
q.push(B->left);
}
return true;
}
};
原文:https://www.cnblogs.com/Trevo/p/12662681.html