?LeetCode刷題實(shí)戰(zhàn)95:不同的二叉搜索樹 II
算法的重要性,我就不多說(shuō)了吧,想去大廠,就必須要經(jīng)過(guò)基礎(chǔ)知識(shí)和業(yè)務(wù)邏輯面試+算法面試。所以,為了提高大家的算法能力,這個(gè)公眾號(hào)后續(xù)每天帶大家做一道算法題,題目就從LeetCode上面選 !
今天和大家聊的問(wèn)題叫做?不同的二叉搜索樹 II,我們先來(lái)看題面:
https://leetcode-cn.com/problems/binary-tree-inorder-traversal/
Given an integer n, generate all structurally unique BST's (binary search trees) that store values 1 ... n.
題意

解題




class Solution:
????def generateTrees(self, n: int) -> List[TreeNode]:
????????ret?= []
????????
????????# 拷貝二叉樹
????????def copyTree(node):
????????????if?node is?None:
????????????????return?None
????????????u?= TreeNode(node.val)
????????????u.left?= copyTree(node.left)
????????????u.right?= copyTree(node.right)
????????????return?u
????????
????????def dfs(n):
????????????# n=1只有一種情況
????????????if?n == 1:
????????????????ret.append(TreeNode(1))
????????????????return
????????????
????????????dfs(n-1)
????????????# 遍歷n=k時(shí)的所有情況
????????????for?i in range(len(ret)):
????????????????u?= ret[i]
????????????????node = TreeNode(n)
????????????????node.left?= u
????????????????ret[i] = node
????????????????
????????????????it = u
????????????????rank = 0
????????????????# 將n插入最右側(cè)鏈路當(dāng)中,有幾種可以選擇的位置,就會(huì)誕生幾種新的放法
????????????????while?it is?not None:
????????????????????node = TreeNode(n)
????????????????????# 為了防止答案之間互不影響,所以需要把樹拷貝一份
????????????????????new?= copyTree(u)
????????????????????cur = new
????????????????????
????????????????????# rank記錄的是每一個(gè)解對(duì)應(yīng)的n放入的深度
????????????????????for?_ in range(rank):
????????????????????????cur = cur.right
????????????????????
????????????????????node.left?= cur.right
????????????????????cur.right?= node
????????????????????
????????????????????ret.append(new)
????????????????????
????????????????????it = it.right
????????????????????rank += 1
????????????
????????if?n == 0:
????????????return?ret
????????dfs(n)
????????return?ret
class?Solution:
????def?generateTrees(self, n: int)?-> List[TreeNode]:
????????ret = []
????????
????????def?dfs(l, r):
????????????cur = []
????????????if?r < l:
????????????????cur.append(None)
????????????????return?cur
????????????
????????????# 枚舉作為樹根的元素
????????????for?i in?range(l, r+1):
????????????????# 枚舉左右子樹的所有子樹的構(gòu)成情況
????????????????for?u in?dfs(l, i-1):
????????????????????for?v in?dfs(i+1, r):
????????????????????????node = TreeNode(i)
????????????????????????node.left = u
????????????????????????node.right = v
????????????????????????cur.append(node)
????????????return?cur
????????????
????????if?n == 0:
????????????return?ret
????????return?dfs(1, n)
上期推文:
