力扣 95不同的二叉搜尋樹II(遞迴)

2021-10-08 07:22:54 字數 1633 閱讀 5779

題目描述

給定乙個整數 n,生成所有由 1 ... n 為節點所組成的 二叉搜尋樹 。

示例:輸入:3

輸出:[

[1,null,3,2],

[3,2,null,1],

[3,1,null,null,2],

[2,1,3],

[1,null,2,null,3]

]解釋:

以上的輸出對應以下 5 種不同結構的二叉搜尋樹:

1          3      3      2          1

\        /       /       / \            \

3     2      1      1   3           2

/      /          \                         \

2     1           2                        3

解題思路:

遞迴

對於一顆二叉搜尋樹,左子樹節點均小於根節點,右子樹節點均大於根節點,因此對於乙個節點i,遞迴構建左子樹0~i-1,和右子樹i+1~n

class treenode(object):

def __init__(self, val=0, left=none, right=none):

self.val = val

self.left = left

self.right = right

class solution(object):

def generatetrees(self, n):

def generate_trees(start, end):

if start > end:

return [none]

all_trees =

for i in range(start, end + 1):

left_trees = generate_trees(start, i - 1)

right_trees = generate_trees(i + 1, end)

for l in left_trees:

for r in right_trees:

cur_tree = treenode(i)

cur_tree.left = l

cur_tree.right = r

return all_trees

return generate_trees(1, n) if n != 0 else

s = solution()

print(s.generatetrees(3))

執行過程解釋:

對於n = 3,首先是節點1(即i = 1),左子樹呼叫generate_trees(1,0)返回none,右子樹呼叫generate_trees(2, 3),經過一系列執行後返回的列表是[2, 3],列表中不是單一的值,而是子樹的所有組合的根節點,這裡列表中的2實際上還有乙個3的右節點,3實際上有乙個2的左節點,遍歷所有的可能組合,1的左子樹永遠為空,右子樹的根節點既可以為2也可以為3,同理i = 2和i = 3也一樣的過程

(力扣) 95 不同的二叉搜尋樹 II

這道題的目的是求出由1到n為節點的所有二叉搜尋樹。首先需要知道二叉搜尋樹的定義。在二叉搜尋樹中,任意取一節點,如果存在左節點,那麼根節點值一定會大於左節點值,同理,如果存在右節點,那麼根結點一定會小於右節點值。通常在涉及構建樹的問題上,可以考慮遞迴,這樣便可以省去重複的 並且這道題可以採用分而治之的...

力扣95 不同的二叉搜尋樹 II

給定乙個整數 n,生成所有由 1 n 為節點所組成的 二叉搜尋樹 示例 輸入 3 輸出 1,null,3,2 3,2,null,1 3,1,null,null,2 2,1,3 1,null,2,null,3 解釋 以上的輸出對應以下 5 種不同結構的二叉搜尋樹 1 3 3 2 1 3 2 1 1 3...

力扣 95 不同的二叉搜尋樹 II

二叉查詢樹 binary search tree 又 二叉搜尋樹,二叉排序樹 它或者是一棵空樹,或者是具有下列性質的二叉樹 若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值 若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值 它的左 右子樹也分別為二叉排序樹。即所有的根節點大於...