题目描述:
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [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
进阶:
你可以运用递归和迭代两种方法解决这个问题吗?
思路:
递归:代码简单,思路上还是有一些难点,除了根节点,其左右子树都需要镜像对称,所以我们要考虑递归比较的元素。
可以发现,左子树的左孩子和右子树的右孩子是对应的,左子树的右孩子和右子树的左孩子是对应的,
递归的返回条件是,当左右两边对应的子节点相等,且左右子树也镜像对称。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
bool Symmetric(struct TreeNode* l, struct TreeNode* r){
if(l == NULL && r == NULL) return true;
if(l == NULL || r == NULL) return false;
return (l->val == r->val) && Symmetric(l->left, r->right) && Symmetric(l->right, r->left);
}
bool isSymmetric(struct TreeNode* root){
if(root == NULL) return true;
return Symmetric(root->left,root->right);
}
迭代:用队列存储每一层的节点,然后两两出队,进行比较。
关键是:进队次序,因为左子树的左孩子和右子树的右孩子是对应的,左子树的右孩子和右子树的左孩子是对应的。
所以,
que[++rear] = p->left;
que[++rear] = q->right;
que[++rear] = p->right;
que[++rear] = q->left;
循环结束的条件是,队列为空。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
//迭代法,用队列
bool isSymmetric(struct TreeNode* root){
struct TreeNode* que[1024];
int front, rear;
front = rear = 0;
que[++rear] = root;
que[++rear] = root;
while(rear != front)
{
struct TreeNode* p = que[++front];
struct TreeNode* q = que[++front];
if(p==NULL && q==NULL) continue;
if(p==NULL || q==NULL) return false;
if(p->val != q->val) return false;
que[++rear] = p->left;
que[++rear] = q->right;
que[++rear] = p->right;
que[++rear] = q->left;
}
return true;
}