LeetCode题目(Python实现):不同的二叉搜索树 II

末蓝、 2023-07-15 07:59 66阅读 0赞

文章目录

  • 题目
    • 递归
      • 算法实现
      • 执行结果
      • 复杂度分析
    • 动态规划
      • 算法实现
      • 执行结果
    • 小结

题目

给定一个整数 n,生成所有由 1 … n 为节点所组成的二叉搜索树

示例

  1. 输入: 3
  2. 输出:
  3. [
  4. [1,null,3,2],
  5. [3,2,null,1],
  6. [3,1,null,null,2],
  7. [2,1,3],
  8. [1,null,2,null,3]
  9. ]
  10. 解释:
  11. 以上的输出对应以下 5 种不同结构的二叉搜索树:
  12. 1 3 3 2 1
  13. \ / / / \ \
  14. 3 2 1 1 3 2
  15. / / \ \
  16. 2 1 2 3

递归

算法实现

  1. def generateTrees(self, n):
  2. """
  3. :type n: int
  4. :rtype: List[TreeNode]
  5. """
  6. # 如果 为空树
  7. if not n:
  8. return []
  9. def new_trees(start, end):
  10. if start > end:
  11. return [None]
  12. all_trees = []
  13. # 针对(start,end)中的每一个i进行切分,也就是求G(i),判断左右是否有节点,通过start和end比较
  14. for i in range(start, end + 1):
  15. # 左子树
  16. left_trees = new_trees(start, i - 1)
  17. # 右子树
  18. right_trees = new_trees(i + 1, end)
  19. for left in left_trees:
  20. for right in right_trees:
  21. tree = TreeNode(i)
  22. tree.left = left
  23. tree.right = right
  24. all_trees.append(tree)
  25. # print(all_trees)
  26. # 注:每次递归进入的子树的all_trees都是不一样的。可以通过打印print()查看控制台的输出,这样更容易理解具体的思路。
  27. return all_trees
  28. return new_trees(1, n)

执行结果

执行结果 : 通过
执行用时 : 52 ms, 在所有 Python3 提交中击败了87.26%的用户
内存消耗 : 15 MB, 在所有 Python3 提交中击败了8.17%的用户
在这里插入图片描述

复杂度分析

在这里插入图片描述

动态规划

算法实现

  1. def generateTrees(self, n: int):
  2. if n == 0:
  3. return []
  4. # 对dp进行初始化
  5. dp = []
  6. for i in range(0, n + 1): # 初始化dp
  7. dp.append([])
  8. for j in range(0, n + 1):
  9. if i == j:
  10. dp[i].append([TreeNode(i)])
  11. elif i < j:
  12. dp[i].append([])
  13. else:
  14. dp[i].append([None])
  15. dp[0][0] = [None]
  16. for i in range(n - 1, 0, -1): # 自下向上进行循环
  17. for j in range(i + 1, n + 1):
  18. for r in range(i, j + 1): # i-j每一个节点为顶点的情况
  19. left = r + 1 if r < j else r # 右边的值需要边界判断,不然会溢出数组
  20. for x in dp[i][r - 1]: # 左右子树排列组合
  21. for y in dp[left][j]:
  22. node = TreeNode(r)
  23. node.left = x
  24. node.right = y
  25. if r == j:
  26. node.right = None
  27. dp[i][j].append(node) # dp[i][j]添加此次循环的值
  28. return dp[1][n]

执行结果

在这里插入图片描述

小结

这次题目想了半天没有思路,看了题解后对递归大致理解了,但是对动态规划也大致明白了,动态规划有点难理解,但说实话画个矩形稍微验算验算就大致明白了该如何运作,看来动态规划得动手,不能光想。。。

发表评论

表情:
评论列表 (有 0 条评论,66人围观)

还没有评论,来说两句吧...

相关阅读