【问题】请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。

【思路】首先使用递归得方法,代码非常得简洁,如果l与r都是nullptr,那么就返回真,如果只有其中一个为nullptr,那么一定不是对称二叉树,则返回false,如果都不是nullptr,则需要判断其值是否相等,并且还要递归判断(l.left, r.right)和(l.right, r.left)两组数是否相等!

 1 /*
 2 struct TreeNode {
 3     int val;
 4     struct TreeNode *left;
 5     struct TreeNode *right;
 6     TreeNode(int x) :
 7             val(x), left(NULL), right(NULL) {
 8     }
 9 };
10 */
11 class Solution {
12 public:
13     bool isSymmetrical(TreeNode* pRoot)
14     {
15         if(pRoot == nullptr)  return true;
16         return process(pRoot->left, pRoot->right);
17     }
18 private:
19     bool process(TreeNode* l, TreeNode* r){
20         if(l == nullptr && r == nullptr)
21             return true;
22         if(l != nullptr && r != nullptr)
23             return l->val == r->val && 
24             process(l->left, r->right) &&
25             process(l->right, r->left);
26         return false;
27     }
28 };

另一种方法,可以使用类似于层次遍历的方式,使用一个队列的方式,每次将成对的元素入堆,然后成对的取出,并进行值得判断,如果相等,则进行下一次判断,不过不相等,返回false。注意,如果两者都是nullptr,则下面不执行,如果只有一个为nullptr,则返回false,因为此时成对元素已经不满足对应相等了!

 1 /*
 2 struct TreeNode {
 3     int val;
 4     struct TreeNode *left;
 5     struct TreeNode *right;
 6     TreeNode(int x) :
 7             val(x), left(NULL), right(NULL) {
 8     }
 9 };
10 */
11 class Solution {
12 public:
13     bool isSymmetrical(TreeNode* pRoot)
14     {
15         if(pRoot == nullptr)  return true;
16         queue<TreeNode*> q;
17         q.push(pRoot->left);
18         q.push(pRoot->right);
19         while(!q.empty()){
20             // 成对的取出元素
21             TreeNode* left = q.front();
22             q.pop();
23             TreeNode* right = q.front();
24             q.pop();  // 删除头节点
25             if(left == nullptr && right == nullptr) continue;
26             if(left == nullptr || right == nullptr) return false;
27             if(left->val != right->val) return false;
28             // 成对的插入元素
29             q.push(left->left);
30             q.push(right->right);
31             q.push(left->right);
32             q.push(right->left);
33         }
34         return true;
35     }
36 };