3个月用python刷完leetcode600题!-树简单题(二)

十五天的时间,刷完了所有的简单题,避免遗忘,所以开始简单题的二刷,第一遍刷题的时候过得速度比较快,因为我觉得基础不好的我,不要硬着头皮去想最优的方法,而是应该尽量去学一些算法思想,所以每道题只给自己5-10分钟的时间想,想不出来的就去找相关的答案,所以刷的比较快。二刷的时候按照leetcode官方给出的题目分类展开,同时,将解题思路记录于加深印象。
想要一起刷题的小伙伴,我们一起加油吧!
我的github连接:https://github.com/princewen/leetcode_python

235. Lowest Common Ancestor of a Binary Search Tree

3个月用python刷完leetcode600题!-树简单题(二)_第1张图片
235. Lowest Common Ancestor of a Binary Search Tree

注意这里是一个二叉搜索树,根结点的右子树上所有的点的值都比根结点大,左子树上所有点的值都比根结点的值小
因此分为四种情况,
1、如果两个节点一个值比节点大,一个小,那么二者的公共节点肯定是根结点,
2、如果两个节点中有一个与根结点的值同样大,那么二者的公共节点同样是根结点
3、如果两个节点的值都比根结点小,那么二者的公共节点出现在根结点的左子树中,递归查询
4、如果两个节点的值都比根结点大,那么二者的公共节点出现在根结点的右子树中,递归查询

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    def lowestCommonAncestor(self, root, p, q):
        """
        :type root: TreeNode
        :type p: TreeNode
        :type q: TreeNode
        :rtype: TreeNode
        """
        if (p.val - root.val) * (q.val - root.val) <= 0:
            return root
        if p.val < root.val and q.val < root.val:
            return self.lowestCommonAncestor(root.left, p, q)
        if p.val > root.val and q.val > root.val:
            return self.lowestCommonAncestor(root.right, p, q)

257. Binary Tree Paths

3个月用python刷完leetcode600题!-树简单题(二)_第2张图片
257. Binary Tree Paths

递归调用

# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    def binaryTreePaths(self, root):
        """
        :type root: TreeNode
        :rtype: List[str]
        """
        if not root:
            return []
        if not root.left and not root.right:
            return [str(root.val)]
        paths = []
        if root.left != None:
            paths += [str(root.val) + '->' + t for t in self.binaryTreePaths(root.left)]
        if root.right != None:
            paths += [str(root.val) + '->' + t for t in self.binaryTreePaths(root.right)]
        return paths

404. Sum of Left Leaves

3个月用python刷完leetcode600题!-树简单题(二)_第3张图片
404. Sum of Left Leaves
# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    def sumOfLeftLeaves(self, root):
        if not root: return 0
        if root.left and not root.left.left and not root.left.right:
            return root.left.val + self.sumOfLeftLeaves(root.right)
        return self.sumOfLeftLeaves(root.left) + self.sumOfLeftLeaves(root.right)  # isn't leave

437. Path Sum III

3个月用python刷完leetcode600题!-树简单题(二)_第4张图片
437. Path Sum III

这里我们定义了一个辅助函数,用于如果从该点出发得到目标值的路径的个数,主函数和辅助函数都采用递归调用的形式:

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    def pathSum(self, root, sum):
        """
        :type root: TreeNode
        :type sum: int
        :rtype: int
        """
        if not root:
            return 0
        return self.pathSumFrom(root, sum) + self.pathSum(root.left, sum) + self.pathSum(root.right, sum)

    def pathSumFrom(self, node, sum):
        if not node:
            return 0
        return (1 if node.val == sum else 0) + self.pathSumFrom(node.left, sum - node.val) + self.pathSumFrom(
            node.right, sum - node.val)

563. Binary Tree Tilt

3个月用python刷完leetcode600题!-树简单题(二)_第5张图片
563. Binary Tree Tilt

递归调用,我们定义了一个辅助函数,函数有两个返回值,一个是子数的所有值的和,另一个是子数的tilt值:

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    def findTilt(self, root):
        """
        :type root: TreeNode
        :rtype: int
        """
        _,ans = self.sumTree(root)
        return ans

    def sumTree(self,node):
        if not node:
            return 0,0
        left,ans1 = self.sumTree(node.left)
        right,ans2 = self.sumTree(node.right)
        return node.val+left+right,abs(right-left)+ans1+ans2

如果你喜欢我写的文章,可以帮忙给小编点个赞或者加个关注,我一定会互粉的!
如果大家对leetcode感兴趣,欢迎跟小编进行交流,小编微信为sxw2251,加我要写好备注哟!:


3个月用python刷完leetcode600题!-树简单题(二)_第6张图片
我的微信

你可能感兴趣的:(3个月用python刷完leetcode600题!-树简单题(二))