代码随想录算法训练营day15|Leetcode226/101

Leetcode226翻转二叉树

226. 翻转二叉树 - 力扣(LeetCode)

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。

 

 思路:

这道题主要是遍历顺序,到底是用前中后的哪种顺序呢?

答案是:前序和后序

首先我们要对左子树和右子树做一个整体反转,先反转左右孩子,然后反转整个左右子树

所以我们处理左右孩子的逻辑要在前面,后序遍历的逻辑是左右根,符合题意,前序遍历也可以,因为先反转根节点,然后再反转左右字数。

为什么不用中续遍历呢?

因为中序遍历是左根右,也就是先处理左子树,然后又处理根节点,再到右子树,但是再右子树时候我们发现现在的这个右子树就是我们之前处理过的左子树,相当于我们并没有对原来的右子树做任何处理,就直接给反转过去了。

递归三部曲:

1.确定要传入的参数,这里我们就传root就可以了

2.确定终止条件,判断如果当前节点为空我们就停止了

3,确定单层递归的逻辑,由于我们采用后序遍历

所以先处理左右在处理根节点

class Solution:
    def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
        def inver_Tree(root):
            if not root:
                return None
            root.left,root.right = root.right,root.left 
            inver_Tree(root.left)
            inver_Tree(root.right)
        inver_Tree(root)
        return root 

Leetcode101对称二叉树

链接:101. 对称二叉树 - 力扣(LeetCode)

题目思路:其实这道题的核心在于:

首先想清楚,判断对称二叉树要比较的是哪两个节点,要比较的可不是左右节点!

对于二叉树是否对称,要比较的是根节点的左子树与右子树是不是相互翻转的,理解这一点就知道了其实我们要比较的是两个树(这两个树是根节点的左右子树),所以在递归遍历的过程中,也是要同时遍历两棵树。

也就是说如果能通过左子树的反转得到右子树,那这个二叉树就对称的

也就是

左子树的左孩子==右子树的右孩子

左子树的右孩子==右子树的左孩子

这就是满足题意得条件

比较的是两个子树的里侧和外侧的元素是否相等。如图所示:

(来自代码随想录)

代码: 

class Solution:
    def isSymmetric(self, root: Optional[TreeNode]) -> bool:
        if not root:
            return False
        return self.compare(root.left,root.right)
    def compare(self,left,right):
        if left==None and right==None:
            return True
        elif left!=None and right==None:
            return False
        elif left==None and right!=None:
            return False
        elif left.val!=right.val:
            return False
        outside = self.compare(left.left,right.right)
        inside  = self.compare(left.right,right.left)
        isSame = outside and inside #左子树:中、 右子树:中 (逻辑处理)
        return isSame

最后这里有一个小坑点,本人亲踩。

不能直接return isinside==outside.

如果是FALSE==FALSE那么返回的结果也是TRUE。所以这里要加一个逻辑判断~!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值