统计和生成所有不同的二叉树
生活随笔
收集整理的這篇文章主要介紹了
统计和生成所有不同的二叉树
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【題目】
給定一個整數N,如果N<1,代表空樹結構,否則代表中序遍歷的結果為{1,2,3,…,N}。請返回可能的二叉樹結構有多少。
【基本思路】
假設num[n]代表n個節點的搜索二叉樹有多少種可能。假設序列{1 , …, i , … , N},如果以i作為頭結點,i的左子樹有i-1個節點,所以可能的結構有num[i-1]種,右子樹有N-i個節點,所以有num[N-i]種可能,故以i作為頭結點的可能的結構的種數為num[i-1]*num[N-i]。?
把從1到N分別作為頭節點,所有可能的結構加起來就是答案,利用動態規劃加速運算
?
進階問題:N的含義不變,假設可能的二叉樹結構有M種,請返回M個二叉樹的頭節點,每一顆二叉樹代表一種可能的結構
class Node:def __init__(self,value):self.value = valueself.left = Noneself.right = Nonedef generateTrees(n):return generate(1,n)def generate(start,end):res = []if start > end:res.append(None)head = Nonefor i in range(start,end+1):head = Node(i)lSubs = generate(start,i-1)rSubs = generate(i+1,end)for l in lSubs:for r in rSubs:head.left = lhead.right = rres.append(cloneTree(head))return resdef cloneTree(head):if head == None:return Noneres = Node(head.value)res.left = cloneTree(head.left)res.right = cloneTree(head.right)?
總結
以上是生活随笔為你收集整理的统计和生成所有不同的二叉树的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 通过先序和中序数组生成后续数组
- 下一篇: 数组中最长连续序列