代码随想录刷题营Day15(102:层序遍历,226:反转二叉树,101:对称二叉树)

102:层序遍历

二叉树的层序遍历需要借助队列来实现,其中记录每一层级的size至关重要!设置一个size,记录每一个层级的大小。初始大小就是1,这需要提前将第一个root节点放入队列中。在遍历每一个层的每个节点的时候(第二个while)需要将下一层的节点放入队列,每遍历一个数值就要记录这个数字到tmp的一维数组中,然后再把这个节点在队列中及时的pop掉。

    def levelOrder(self,root):
        res=[]
        if not root:
            return res
        que=deque([root])
        while(que):
            tmp=[]
            size=len(que)
            while(size):
                cur=que.popleft()
                tmp.append(cur.val)
                size=size-1
                if cur.left:
                    que.append(cur.left)
                if cur.right:
                    que.append(cur.right)
            res.append(tmp)
        return res

226:反转二叉树

在这里插入图片描述
用递归做,绝绝子!
乐乐用的前序遍历做的:

    def invertTree(self,root):
        if not root:
            return None
        root.left,root.right=root.right,root.left
        self.invertTree(root.left)
        self.invertTree(root.right)
        return root

其间有个小插曲,当乐乐这么写赋值就不对了:
root.left=root.right
root.right=root.left
分开写就不对了,真是好奇怪啊!
先不说这个了,反转二叉树是指针的反转,不是数值的反转,如果用数值反转会很麻烦的,而指针反转就会很简单。如图所示,用前序做的话,当前处理的节点是4,也就是我们要反转他的两个左孩子和右孩子(这个不用考虑他有咩有左右孩子,因为没有就是节点None)那就反转成:
在这里插入图片描述
然后再遍历他的4的左孩子节点也就是7,反转7所对应的左右孩子,6和9。即:
在这里插入图片描述
继续遍历9,发现没有左右孩子,那就return,遍历6,发现也没有左右孩子,就在返回开始遍历右子树2,反转他的左右孩子:
在这里插入图片描述
然后在遍历3,7发现都没有左右孩子,那就反转完成了!


101:对称二叉树

在这里插入图片描述
判断一棵二叉树是不是对称的,其实就是对比root的左右孩子子树是不是可以反转的。
这里可以分别用两个指针去遍历两个子树,用left指针去遍历左子树,用right指针遍历右子树。
先讨论什么时候直接就返回False了:
(1)left指针指向的节点为空,而right指向的节点不为空。
(2)right指针指向的节点为空,而left指向的节点不为空。
(3)left和right指向的节点都不为空,但是值不相同。
以上三种情况都是返回False的。
那啥时候返回True呢:
(1)left指针指向的节点和right指针指向的节点都为空。
(2)left指针指向的节点和right指针指向的节点不为空,且值还相等。
放入递归中的指针就是让这两个指针指向的节点进行比较,一旦发现False,直接判定不对称。
那么,这种思路就需要收集遍历的信息,只有一直True下去,才能够最后判定是对称的,因此,这种收集信息的遍历,那用后序遍历了。

    def isSymmetric(self,root):
        def Symmetric(left,right):
            if left and not right:
                return False
            elif left and right and left.val!=right.val:
                return False
            elif not left and right:
                return False
            elif not left and not right:
                return True
            outside=Symmetric(left.left,right.right)
            inside=Symmetric(left.right,right.left)
            isSame=outside and inside
            return isSame
        if not root:
            return True
        return Symmetric(root.left,root.right)

觉得比较难理解的是这里:

            outside=Symmetric(left.left,right.right)
            inside=Symmetric(left.right,right.left)
            isSame=outside and inside

这种写法isSame相当于收集内侧和外侧的必须打成一致的信息,才能够向上返回信息。这个写法,学到了!其实单独看这个代码看不出是后序,但是一看这个代码上来先处理左右孩子的信息,那肯定就是后序的写法,所以,后序遍历不是说最后写处理中间节点信息的就是后序的递归写法!
还有还有,写二叉树的题,一定不要忘记上来先判断root是不是为None!这个必写!


  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值