Python算法之求n個(gè)節(jié)點(diǎn)不同二叉樹個(gè)數(shù)
問題
創(chuàng)建一個(gè)二叉樹
二叉樹有限多個(gè)節(jié)點(diǎn)的集合,這個(gè)集合可能是:
空集
由一個(gè)根節(jié)點(diǎn),和兩棵互不相交的,分別稱作左子樹和右子樹的二叉樹組成
創(chuàng)建二叉樹:
創(chuàng)建節(jié)點(diǎn)
再創(chuàng)建節(jié)點(diǎn)之間的關(guān)系
Python代碼示例
# !/usr/bin/env python # -*-encoding: utf-8-*- # author:LiYanwei # version:0.1 class TreeNode(object): def __init__ (self, data, left = None, right = None): self.data = data self.left = left self.right = right def __str__(self): return str(self.data) # 節(jié)點(diǎn) A = TreeNode('A') B = TreeNode('B') C = TreeNode('C') D = TreeNode('D') # 節(jié)點(diǎn)間的關(guān)系 A.left = B A.right = C B.right = D print B.right
問題
求n個(gè)節(jié)點(diǎn)不同二叉樹個(gè)數(shù)
1個(gè)節(jié)點(diǎn)
根節(jié)點(diǎn)1 1種
1種二叉樹
2個(gè)節(jié)點(diǎn)
根節(jié)點(diǎn)1 左節(jié)點(diǎn)1 1種(依照1節(jié)點(diǎn)的推斷)
根節(jié)點(diǎn)1 右節(jié)點(diǎn)1 1種(依照1節(jié)點(diǎn)的推斷)
2種二叉樹
3個(gè)節(jié)點(diǎn)
根節(jié)點(diǎn)1 左節(jié)點(diǎn)0 右節(jié)點(diǎn)2 2種(依照2節(jié)點(diǎn)的推斷)
根節(jié)點(diǎn)1 左節(jié)點(diǎn)1 右節(jié)點(diǎn)1 1種(依照1節(jié)點(diǎn)的推斷)
根節(jié)點(diǎn)1 左節(jié)點(diǎn)2 右節(jié)點(diǎn)0 2種(依照2節(jié)點(diǎn)的推斷)
5種二叉樹
4個(gè)節(jié)點(diǎn)
根節(jié)點(diǎn)1 左節(jié)點(diǎn)0 右節(jié)點(diǎn)3 5種(依照3節(jié)點(diǎn)的推斷)
根節(jié)點(diǎn)1 左節(jié)點(diǎn)1 右節(jié)點(diǎn)2 2種(依照2節(jié)點(diǎn)的推斷)
根節(jié)點(diǎn)1 左節(jié)點(diǎn)2 右節(jié)點(diǎn)1 2種(依照2節(jié)點(diǎn)的推斷)
根節(jié)點(diǎn)1 左節(jié)點(diǎn)3 右節(jié)點(diǎn)0 5種(依照4上面的推斷)
共14種二叉樹
...
n個(gè)節(jié)點(diǎn)
遞歸進(jìn)行累加
Python代碼示例
# !/usr/bin/env python # -*-encoding: utf-8-*- # author:LiYanwei # version:0.1 # 求n個(gè)節(jié)點(diǎn)不同二叉樹個(gè)數(shù) def count(n): # root : 1 # left : k # right : n - 1- k # s = 0 # if n == 0: # # 空樹 # return 1 s = count.cache.get(n, 0) if s: return s for k in xrange(n): s += count(k) * count(n - 1 - k) count.cache[n] = s return s # 重復(fù)計(jì)算優(yōu)化 count.cache = {0 : 1} print count(100)
總結(jié)
以上就是本文關(guān)于Python算法之求n個(gè)節(jié)點(diǎn)不同二叉樹個(gè)數(shù)的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站:Python探索之自定義實(shí)現(xiàn)線程池、python中模塊的__all__屬性詳解等,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!
- python3實(shí)現(xiàn)二叉樹的遍歷與遞歸算法解析(小結(jié))
- Python實(shí)現(xiàn)的序列化和反序列化二叉樹算法示例
- Python數(shù)據(jù)結(jié)構(gòu)與算法之二叉樹結(jié)構(gòu)定義與遍歷方法詳解
- Python實(shí)現(xiàn)基于二叉樹存儲結(jié)構(gòu)的堆排序算法示例
- Python二叉樹的定義及常用遍歷算法分析
- python實(shí)現(xiàn)的二叉樹定義與遍歷算法實(shí)例
- Python中的二叉樹查找算法模塊使用指南
- python實(shí)現(xiàn)的二叉樹算法和kmp算法實(shí)例
- python二叉樹常用算法總結(jié)
相關(guān)文章
對python中的iter()函數(shù)與next()函數(shù)詳解
今天小編就為大家分享一篇對python中的iter()函數(shù)與next()函數(shù)詳解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-10-10淺談算法之最小生成樹Kruskal的Python實(shí)現(xiàn)
最小生成樹Kruskal算法可以稱為“加邊法”,初始最小生成樹邊數(shù)為0,每迭代一次就選擇一條滿足條件的最小代價(jià)邊,加入到最小生成樹的邊集合里。本文將介紹它的原理,并用Python進(jìn)行實(shí)現(xiàn)2021-06-06Python數(shù)據(jù)結(jié)構(gòu)之隊(duì)列詳解
棧和隊(duì)列是在程序設(shè)計(jì)中常見的數(shù)據(jù)類型。本節(jié)將詳細(xì)介紹隊(duì)列的定義及其不同實(shí)現(xiàn),并且給出隊(duì)列的一些實(shí)際應(yīng)用,感興趣的小伙伴可以了解一下2022-03-03Python pkg_resources模塊動態(tài)加載插件實(shí)例分析
當(dāng)編寫應(yīng)用軟件時(shí),我們通常希望程序具有一定的擴(kuò)展性,額外的功能——甚至所有非核心的功能,都能通過插件實(shí)現(xiàn),具有可插拔性。特別是使用 Python 編寫的程序,由于語言本身的動態(tài)特性,為我們的插件方案提供了很多種實(shí)現(xiàn)方式2022-08-08如何利用Python開發(fā)一個(gè)簡單的猜數(shù)字游戲
這篇文章主要給大家介紹了關(guān)于如何利用Python開發(fā)一個(gè)簡單的猜數(shù)字游戲的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09Python上級目錄文件導(dǎo)入的幾種方法(from.import)
有時(shí)候我們可能需要import另一個(gè)路徑下的python文件,下面這篇文章主要給大家介紹了關(guān)于Python上級目錄文件導(dǎo)入的幾種方法,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-12-12Django urls.py重構(gòu)及參數(shù)傳遞詳解
這篇文章主要介紹了Django urls.py重構(gòu)及參數(shù)傳遞詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07