具体的思路是使用前序、中序、后序或者层序遍历对二叉树进行遍历,在遍历的同时判断树的左右两侧是否相同。
首先来一个比较简单的使用循环的解法,这个方法使用循环和一个队列同时从两个方向对树进行层序遍历,一个从左向右加入元素,另一边从右向左加入元素。通过在遍历的时候判断元素是否相同来判断这棵树是否对称。
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
|
class Solution { public: bool isSymmetrical(TreeNode* pRoot) { queue <TreeNode*> q; q.push(pRoot); q.push(pRoot); while(!q.empty()){ TreeNode* l=q.front(); q.pop(); TreeNode* r=q.front(); q.pop(); if(l==NULL && r==NULL) continue; if(l==NULL || r==NULL) return false; if(l->val != r->val) return false; q.push(l->left); q.push(r->right); q.push(l->right); q.push(r->left); } return true; } };
|
最后,还可以使用递归去实现。递归使用了前序遍历来实现。
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
|
class Solution { public: bool isSymmetrical(TreeNode* pRoot) { return this->isSymmetric(pRoot,pRoot); } bool isSymmetric(TreeNode* pRoot1,TreeNode* pRoot2) { if(pRoot1==NULL && pRoot2==NULL) return true; if(pRoot1==NULL || pRoot2==NULL) return false; if(pRoot1->val!=pRoot2->val) return false; return this->isSymmetric(pRoot1->left,pRoot2->right) && this->isSymmetric(pRoot1->right,pRoot2->left); }
};
|
PS:这道题之前在 Leetcode 中见过,但是到这里也基本忘记的差不多了,真的是边做边忘记啊。