【LC打卡-Python】二叉树-104, 543, 124, 687

  • 二叉树递归遍历

二叉树的一个重要思路就是递归!!!下面几题非常相似全都是递归!!

104. 二叉树的最大深度-简单

题目概述:二叉树求深度。

题目网址:https://leetcode-cn.com/problems/maximum-depth-of-binary-tree/

题目思路:二叉树的基本操作:递归。很多对二叉树的操作思路都很相似,属于最基本但是必须掌握的类型了。不要忘记输入节点是空的基本情况。

class Solution:
    def maxDepth(self, root: TreeNode) -> int:
        if not root:
            return 0
        return max(self.maxDepth(root.left), self.maxDepth(root.right)) + 1

543. 二叉树的直径-简单

题目概述:二叉树求最长路径。

题目网址:https://leetcode-cn.com/problems/diameter-of-binary-tree/

题目思路:主要思路相似要采用递归。但是,这个最长路径要么经过节点本身,要么不经过。因为可能答案不包括根节点,这种情况其实是不在递归求解里面的,所以要针对这个情况对递归作出调整。

如果不经过节点本身,那就是在左或者右子树中有最远路径,如果经过了节点本身其实就是左子树的深度加右子树的深度。所以可以偷懒的直接用求深度的函数加递归来做:

class Solution:
    def diameterOfBinaryTree(self, root: TreeNode) -> int:
        if not root:
            return 0
        def dep(r):
            if not r:
                return 0
            return max(dep(r.left), dep(r.right)) + 1
        return max(self.diameterOfBinaryTree(root.left), self.diameterOfBinaryTree(root.right), dep(root.left) + dep(root.right)) 

更普遍而且也更好的做法是使用一个全局变量ans进行记录,每次递归都返回包含根节点的情况,如果其中不包含根节点的答案更好就更新ans,否则就不更新。以此来求最长路径:

class Solution:
    def diameterOfBinaryTree(self, root: TreeNode) -> int:
        self.ans = 0
        if not root:
            return 0

        def lr(rt):
            if not rt:
                return 0
            l = lr(rt.left)
            r = lr(rt.right)
            self.ans = max(self.ans, l + r)
            return max(l, r) + 1

        lr(root)
        return self.ans

124. 二叉树中的最大路径和-困难

题目概述:二叉树任意两节点的最大路径和,至少含一个节点。

题目网址:https://leetcode-cn.com/problems/binary-tree-maximum-path-sum/

题目思路:这题和上一题的思路简直一摸一样。唯一的区别是,这次节点含有负数,因此要考虑当子节点为负时要舍弃。

代码和上一题几乎一样,唯一要改的算式中是加节点值。然后要注意舍弃掉负节点。

class Solution:
    def maxPathSum(self, root: TreeNode) -> int:
        self.ans = root.val
        if not root:
            return 0

        def lr(rt):
            if not rt:
                return 0
            # 舍弃负节点
            l = max(lr(rt.left), 0)
            r = max(lr(rt.right), 0)
            self.ans = max(self.ans, l + r + rt.val)
            return max(l, r) + rt.val

        lr(root)
        return self.ans

687. 最长同值路径-简单

题目概述:二叉树所有节点值相等的最长路径。

题目网址:https://leetcode-cn.com/problems/longest-univalue-path/

题目思路:这题和543题的思路也是一摸一样。唯一的区别是,节点值要相等。

class Solution:
    def longestUnivaluePath(self, root: TreeNode) -> int:
        self.ans = 0
        if not root:
            return 0

        def lr(rt):
            if not rt:
                return 0
            l = lr(rt.left)
            # 左右子节点如果和根节点树枝不一样置为0
            if l != 0:
                if rt.left.val != rt.val:
                    l = 0
            r = lr(rt.right)
            if r != 0:               
                if rt.right.val != rt.val:
                    r = 0
            self.ans = max(self.ans, l + r)
            return max(l, r) + 1

        lr(root)
        return self.ans

 

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值