zerglurker 发表于 2018-11-16 17:10

[笔记]算法学习:不同的二叉搜索树 II

本帖最后由 wushaominkk 于 2018-11-18 15:53 编辑

题目:

解题要点:1 树类型的算法,一般都可以用递归来解决,因此首先考虑递归2 接着,要考虑如何生成树3 最后考虑如何输出树具体内容看下面代码注释import json
import json


# Definition for a binary tree node.
class TreeNode:# 树的数据结构
    def __init__(self, x):
      self.val = x
      self.left = None
      self.right = None


class Solution:
    def generateTrees(self, n):
      """
      :type n: int
      :rtype: List
      """
      if n == 0:# 特殊情况处理
            return []
      if n == 1:# 特殊情况处理
            return []
      total = # 首先生成点的集合
      nodes = self.makeNode(total)# 生成树
      result = list()
      for node in nodes:
            d = self.dumpTreeNode(node)# 导出结果树集合
            tmp = list()
            for i in range(9999):# 一层一层的将树输入到列表
                if i not in d:
                  break
                tmp.extend(d)
            while tmp[-1] is None:# 将尾部的空节点删除
                del tmp[-1]
            result.append(tmp)# 将列表加入结果集
      return result

    def makeNode(self, item_set: list) -> list:# 生成树
      if len(item_set) == 0:# 节点集没有一个点
            return
      if len(item_set) == 1:# 节点集只有一个点
            return )]
      result = list()
      if len(item_set) == 2:# 节点集只有两个点
            if item_set < item_set:
                node = TreeNode(item_set)
                node.right = TreeNode(item_set)
                result.append(node)
                node = TreeNode(item_set)
                node.left = TreeNode(item_set)
                result.append(node)
            else:
                node = TreeNode(item_set)
                node.left = TreeNode(item_set)
                result.append(node)
                node = TreeNode(item_set)
                node.right = TreeNode(item_set)
                result.append(node)
            return result
      for i in item_set:# 节点集有多个点
            left = list()
            right = list()
            for j in item_set:# 遍历所有点,依次做根节点
                if j == i:
                  continue
                if j < i:
                  left.append(j)
                  continue
                right.append(j)
            ll = self.makeNode(left)
            rr = self.makeNode(right)
            for l_ in ll:
                for r_ in rr:# 排列组合左右子树
                  node = TreeNode(i)
                  node.left = l_
                  if r_ is not None:
                        node.right = r_
                  result.append(node)
      return result

    def dumpTreeNode(self, node: TreeNode, level: int = 0) -> dict:# 导出树
      result = dict()
      result =
      if isinstance(node.left, TreeNode):
            r = self.dumpTreeNode(node.left, level + 1)# 递归导出子树
            for k in r:
                if k not in result:
                  result = list()
                result.extend(r)
      else:
            if level + 1 not in result:
                result = list()
            result.append(node.left)
      if isinstance(node.right, TreeNode):
            r = self.dumpTreeNode(node.right, level + 1)# 递归导出子树
            for k in r:
                if k not in result:
                  result = list()
                result.extend(r)
      else:
            if level + 1 not in result:
                result = list()
            result.append(node.right)
      return result


def main():# 测试函数主函数
    test = [
      '[]',
      '[]',
      '[,]',
      '[,,,,]',
      '[,,,,,,,,,,,,,]',
      '[,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,]'
    ]
    for i in range(len(test)):
      s = Solution()
      r = s.generateTrees(i)
      s = test
      r_ = json.loads(s)
      print(len(r), len(r_))
      for j, v in enumerate(r):
            if v != r_:
                print(i, v == r_, v, r_)


if __name__ == '__main__':
    main()

wangqiustc 发表于 2018-11-16 18:28

python的类有点复杂,我是能避开就避开了

zerglurker 发表于 2018-11-16 21:35

qcztsn 发表于 2018-11-16 19:51
楼主这个是leetcode上的题目吗?

是的,最近下班了就会研究这个,把自己写的代码发这里来
这个是提交通过的
上面的代码不但有正确性的限制,还有性能上面的限制
有兴趣也可以一起啊

zerglurker 发表于 2018-11-16 21:36

wangqiustc 发表于 2018-11-16 18:28
python的类有点复杂,我是能避开就避开了

python3已经改进很多了,加入了保护成员和方法(名称前面加下划线)
python的类其实还是很容易的
属性和方法和其他相比更简单

小黑LLB 发表于 2019-2-15 21:44

二叉树搜索有什么简单的例子么,看上去好复杂,先收藏一下,之后再研究一下{:1_893:}
页: [1]
查看完整版本: [笔记]算法学习:不同的二叉搜索树 II