• 题目要求:

  • 思路:

    • 构建一个二叉树,节点有以下属性:
    • self.left = Noneself.right = Noneself.val = val  # 节点值self.nodecount = 1 # 以后节点值呈现了多少次self.leftcount = 0  # 左子树节点数量
    • 从后往前遍历数组元素,如果以后的数组元素值与以后树节点值相等,那么把以后节点呈现的次数加一
    • 如果以后元素的值大于树节点的值,如果以后节点有右节点,持续比拟右节点,如果以后节点没有右节点,用以后的数组元素创立新的节点,插入到树中
    • 如果以后元素的值小于节点的值,如果以后节点有左节点,持续比拟左节点,如果以后的节点没有左节点,用以后的数组元素创立新的节点,插入到树中
  • 代码:
class TreeNode(object):    def __init__(self, val):        self.left = None        self.right = None        self.val = val  # 节点值        self.nodecount = 1 # 以后节点值呈现了多少次        self.leftcount = 0  # 左子树节点数量class Solution:    def countSmaller(self, nums: List[int]) -> List[int]:        n = len(nums)                res = [0] * n        if n == 0 or n == 1:            return res        root = TreeNode(nums[-1])        for i in range(n - 2, -1, -1):            res[i] = self.insertNode(root, nums[i])        return res        # 往二叉搜寻树中插入新的节点    def insertNode(self, root, val):        cur = root        res = 0        while cur:            if cur.val == val:                cur.nodecount += 1                res += cur.leftcount                break            elif cur.val < val:                    res += cur.leftcount + cur.nodecount                    if cur.right:                        cur = cur.right                    else:                        cur.right = TreeNode(val)                        break            else:                cur.leftcount += 1                if cur.left:                    cur = cur.left                else:                    cur.left = TreeNode(val)                    break        return res
  • 残缺代码:
class TreeNode(object):    def __init__(self, val):        self.left = None        self.right = None        self.val = val          self.nodecount = 1         self.leftcount = 0  class Solution:    def countSmaller(self, nums: List[int]) -> List[int]:        n = len(nums)                res = [0] * n        if n == 0 or n == 1:            return res        root = TreeNode(nums[-1])        for i in range(n - 2, -1, -1):            res[i] = self.insertNode(root, nums[i])        return res        def insertNode(self, root, val):        cur = root        res = 0        while cur:            if cur.val == val:                cur.nodecount += 1                res += cur.leftcount                break            elif cur.val < val:                    res += cur.leftcount + cur.nodecount                    if cur.right:                        cur = cur.right                    else:                        cur.right = TreeNode(val)                        break            else:                cur.leftcount += 1                if cur.left:                    cur = cur.left                else:                    cur.left = TreeNode(val)                    break        return res
  • 参考视频:LeetCode315 计算右侧小于以后元素的个数 BST解法