解
递归
例如:1 2 3
- 取3为根节点 则其左子树包括 1 和 2 ,右子树没有节点
- 对于左子树 1 和 2 可以取1为根节点 或 取2为根节点
- 取1为根节点 则左子树没有节点 右子树节点为2
- 取2为根节点 则左子树节点为2 右子树没有节点
- 对于左子树 1 和 2 可以取1为根节点 或 取2为根节点
# 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: int) -> List[TreeNode]:
if n == 0:
return []
return self.dfs(1, n)
def dfs(self, left, right):
# 若没有节点 则为[None]
if left > right:
return [None]
root_list = list()
# 遍历 可以以任何没有加入树的节点为当前层的根节点
for i in range(left, right+1):
# 选定i为根节点 左子树的根节点列表
left_root_list = self.dfs(left, i-1)
# 选定i为根节点 右子树的根节点列表
right_root_list = self.dfs(i+1, right)
# 组合任意的左子树根节点和右子树根节点 每一种组合都是二叉树的一种新结构
for left_root in left_root_list:
for right_root in right_root_list:
root = TreeNode(i)
root.left = left_root
root.right = right_root
# 将新结构添加到根节点列表
root_list.append(root)
return root_list
运行实例
分析
- 1为根节点
- left_root_list == [None]
- right_root_list == [2, 3] 注意这里的2 和 3 为根节点 TreeNode的实例
- 则 1为根的有2种结构
- 2为根节点
- left_root_list == [1]
- right_root_list == [2]
- 则 2为根的有1种结构
- 3为根节点
- left_root_list == [1, 2]
- right_root_list == [None]
- 则 3为根的有2种结构