101. Symmetric Tree
我的思路:
这题是说判断一颗树是否是镜像的。那么怎么判断呢?
如果说,一左一右子节点的值不相同(包含一个存在一个不存在的情况),那么就肯定不一样的。此时我们就需要比较子节点的子节点了,注意到是镜像,显然l->r和r->l比,l->l和r->r比。此时已经到第三层了。我们想要用递归,就需要验证一下,这个规律是否正确。
其实在第2层的时候,我们就把问题已经变成了这样的问题:左右两课树是否对称。第三层同样是这样的问题,那么递归下去就是没有问题的。
于是写出了递归的算法。
后来我构造了足够多的例子观察之后,发现是有这么一个性质的:树的每一层应该是对称的,因此用一个栈和bfs也是可以解决问题的。
我的递归代码:
/**
* 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 compareTree(root->left, root->right);
}
private:
bool compareTree(TreeNode* lnode, TreeNode *rnode) {
if(!lnode) {
return (NULL == rnode);
}
if(!rnode) {
return false;
}
if(lnode->val != rnode->val) {
return false;
}
return compareTree(lnode->left, rnode->right) && compareTree(lnode->right, rnode->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) {
return true;
}
bool flag = true;
deque<TreeNode*> q;
q.push_back(root->left);
q.push_back(root->right);
while (q.size()) {
TreeNode* t1 = q.front();
q.pop_front();
TreeNode* t2 = q.front();
q.pop_front();
if (t1 && t2 && t1->val == t2->val) {
q.push_back(t1->left);
q.push_back(t2->right);
q.push_back(t1->right);
q.push_back(t2->left);
}
else if (!t1 && !t2) {
;
}
else {
flag = false;
break;
}
}
return flag;
}
};
用的是我所说的非递归的方法。