101. Symmetric Tree

描述:
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一种类型,特殊变量。**

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值