描述:
Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).
For example, this binary tree [1,2,2,3,4,4,3] is symmetric:
1
/ \
2 2
/ \ / \
3 4 4 3
But the following [1,2,2,null,3,null,3] is not:
1
/ \
2 2
\ \
3 3
意思:给出一棵二叉树,返回它是否为一棵以中心点root为对称的树。
第一种是这样:
这是左右对称的
第二种是这样:
这种不是左右对称,应该是null对null,值对值,就像一面镜子
这里我们使用bfs来搜索这两个子树:
class Solution {
public:
bool isSymmetric(TreeNode* root) {
if(root == nullptr){return true;}
//这里发现一个问题:我注释掉这一行竟然慢了一倍的时间,8ms,是测试用例的问题么?
vector<TreeNode* > res;
res.push_back(root);
while(!res.empty()){
vector<TreeNode* > temp;
int size = res.size();
int i = 0;
int j = size - 1;
while(i < j){
if((res[i] == nullptr && res[j] != nullptr) || (res[i] != nullptr && res[j] == nullptr)){
return false;
}
if(res[i] != nullptr && res[j] != nullptr && res[i]->val != res[j]->val){
return false;
}
i++;
j--;
}
for(int i = 0;i<size;i++){
if(res[i] != nullptr){
temp.push_back(res[i]->left);
temp.push_back(res[i]->right);
}
}
res.swap(temp);
}
return true;
}
};
大体的思路是这样:
1.如果root是空的,直接return true
2.不为空,且有左右子树,一次遍历一层,存放在数组res中,如果是对称的,那么整个数组都是对称的,给定两个指针i,j,分别从前和后扫过来,只要遇到不等的情况,直接return false;;都对称的话继续扫描下一层,直最后一层,全部对称就退出while,返回true。
用队列也是一样的,把我好每一次比价的元素即可,这里用的vector和下标。
代码中提到一个问题:
在注释了第一行的判断之后,程序跑的时间从4ms到了8ms,直接翻了一倍,暂时我还不知道到底怎么回事。但是注意这种一步操作即使注释掉也不能优化整个时间复杂度,所以我们尽可能保留。
python:
class Solution(object):
def isSymmetric(self, root):
if root == None:
return True
node = [root]
while node:
i = 0
j = len(node) - 1
temp = []
while i < j:
if (node[i] != None and node[j] == None) or (node[i] == None and node[j] != None):
return False
if node[i] != None and node[j] != None and node[i].val != node[j].val:
return False
i+=1
j-=1
for item in node:
if item:
temp.append(item.left)
temp.append(item.right)
node = temp
return True
这里也提到一个问题:
**None在python中是一种类型,而不是存在不存在的意思。
可以这样if not item: – 表示不存在,但是别使用if item != None,这个不是if item不存在,而是不等于None一种类型,特殊变量。**