对称二叉树

题目描述


给定一个二叉树,检查它是否是镜像对称的。

例如,二叉树 [1,2,2,3,4,4,3] 是对称的。

1
2
3
4
5
    1
/ \
2 2
/ \ / \
3 4 4 3

来源:LeetCode

解法一


给定一个根节点,如何判断左右子树对称,设计一个递归函数,传递左右子树的根节点到递归函数,返回值是这两颗子树是否相等。在函数里,每次只比较两个子树的根节点是否相等,剩下的交给函数递归求解。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/**
* 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) return true;
return helper(root->left, root->right);
}

bool helper(TreeNode * left, TreeNode * right) {
if(!left && !right) return true;
if(!left || !right) return false;
if(left->val != right->val) return false;
return helper(left->left, right->right) && helper(left->right, right->left);
}
};

解法二


既然对称的树,每一层都是符合对称的规则,那么能不能按照逐层判断的方式,层次遍历,每一层判断过程中,如果检测到不对称,则立即返回,如果最后遍历完,仍然没有不对称的,则说明树是对称的。
注意:此处push到队列的后续节点,可以是null,null是参与比较是否对称的。而一般的二叉树层次遍历只输出非null的节点。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/**
* 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) return true;
queue<TreeNode*> q;
q.push(root->left);
q.push(root->right);
while(!q.empty()) {
// 每次取对称位置的两个节点判断
TreeNode *node1 = q.front();
q.pop();
TreeNode *node2 = q.front();
q.pop();
// 继续判断别的对称位置的节点
if(!node1 && !node2) continue;
if(!node1 || !node2) return false;
if(node1->val != node2->val) return false;
q.push(node1->left);
q.push(node2->right);
q.push(node1->right);
q.push(node2->left);
}
return true;
}
};