代码随想录算法训练营第十四天|226. 翻转二叉树、101. 对称二叉树、104. 二叉树的最大深度、111. 二叉树的最小深度

如何判断是不是要使用递归:看子问题是不是有相同的处理逻辑
递归三步法:1.确定终止条件 2.递归内的逻辑 3.递归

226. 翻转二叉树

leetcode 226. 翻转二叉树
代码随想录

class Solution:
    def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
        def invert(root):
            if root == None: # 边界条件
                return 
            # 交换
            temp = root.left
            root.left = root.right
            root.right = temp
            # 递归
            invert(root.left)
            invert(root.right)
        invert(root)
        return root

101. 对称二叉树

leetcode 101. 对称二叉树
代码随想录

使用两个指针一个向左,一个向右同时遍历树;比较两个节点是不是相同。终止条件1.不同2.叶子节点(最终的); 然后递归的时候,左和右比较,右和左比较。

class Solution:
    def isSymmetric(self, root: Optional[TreeNode]) -> bool:
        if root == None:
            return True
        def compare(node1, node2):
            if node1 == None and node2 != None:
                return False
            elif node1 != None and node2 == None:
                return False
            elif node1 == None and node2 == None:
                return True
            elif node1.val != node2.val:
                return False
            condition1 = compare(node1.left, node2.right)
            condition2 = compare(node1.right, node2.left)
            return condition1 and condition2
        return compare(root.left, root.right)

104. 二叉树的最大深度

leetcode 104. 二叉树的最大深度
代码随想录

class Solution(object):
    def maxDepth(self, root):
        """
        :type root: TreeNode
        :rtype: int
        """
        def deep(root):
            if root == None: # 到达叶子节点,返回0
                return 0
            return max(deep(root.left), deep(root.right))+1 # 左右最大的+1
        return deep(root)
        

111. 二叉树的最小深度

leetcode 111. 二叉树的最小深度
代码随想录

最小深度一开始用和最大深度一样的写法,结果解答错误,是因为没搞清楚min(left,right)这个不一定是找到的叶子节点,比如example中的偏二叉树。
所以需要增加条件1.如果左右孩子,那就是叶子节点 返回1;2.如果只有左(右)子树,那就返回右(左)子树的最小高度+1

class Solution:
    def minDepth(self, root: Optional[TreeNode]) -> int:
        if root == None:
            return 0
        def deep(root):
            # 一开始的错误解法
            # if root == Nonoe:
                # return 0
            # return min(left, right) +1
            if root.left == None and root.right == None:
                return 1
            elif root.left == None:
                return deep(root.right) + 1
            elif root.right == None:
                return deep(root.left) + 1
            return min(deep(root.left), deep(root.right)) + 1
        return deep(root)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值