'# -*- coding: utf-8 -*-'
'# 節(jié)點(diǎn)類'
class Node(object):
def __init__(self, data=None, lchild=None, rchild=None):
self.data = data
self.lchild = lchild
self.rchild = rchild
'# 二叉樹類'
class Bitree(object):
def __init__(self):
self.root = Node()
self.myqueue = []
# 添加節(jié)點(diǎn)(利用隊(duì)列來實(shí)現(xiàn),判斷節(jié)點(diǎn)的左右子樹是否有值约炎,沒值賦值后并將左右節(jié)點(diǎn)添加到隊(duì)列中偷办,若右節(jié)點(diǎn),將該節(jié)點(diǎn)從隊(duì)列中移除
def addnode(self, value):
node = Node(value)
if self.root.data is None: # 如果樹是空的,則對根節(jié)點(diǎn)賦值
self.root = node
self.myqueue.append(self.root)
else:
treenode = self.myqueue[0] # 此節(jié)點(diǎn)的子樹還不完全
if treenode.lchild is None:
treenode.lchild = node
self.myqueue.append(treenode.lchild)
else:
treenode.rchild = node
self.myqueue.append(treenode.rchild)
self.myqueue.pop(0) # 經(jīng)歷過給右節(jié)點(diǎn)賦值仆抵,該節(jié)點(diǎn)一定是完全的巩割,故從列表中pop出(隊(duì)列,先進(jìn)先出)
# 利用遞歸實(shí)現(xiàn)先序遍歷二叉樹
def preorder_re(self, root):
if root is None:
return
else:
# 遍歷順序?yàn)椤案笥摇? print(root.data, end=' ')
self.preorder_re(root.lchild)
self.preorder_re(root.rchild)
# 利用遞歸實(shí)現(xiàn)中序遍歷二叉樹
def inorder_re(self, root):
if root is None:
return
else:
# 遍歷順序?yàn)椤白蟾摇? self.inorder_re(root.lchild)
print(root.data, end=' ')
self.inorder_re(root.rchild)
# 利用遞歸實(shí)現(xiàn)后序遍歷二叉樹
def backorder_re(self, root):
if root is None:
return
else:
# 遍歷順序?yàn)椤白笥腋? self.backorder_re(root.lchild)
self.backorder_re(root.rchild)
print(root.data, end=' ')
# 利用堆棧實(shí)現(xiàn)先序遍歷二叉樹亭珍,棧的特點(diǎn)先進(jìn)后出
def preorder_stack(self, root):
if root is None:
return
node = root
mystack = []
while node or mystack: # 當(dāng)椃蠹兀空,則代表所有節(jié)點(diǎn)都已遍歷完
while node:
print(node.data, end=' ')
mystack.append(node) # 將節(jié)點(diǎn)添加到棧中
node = node.lchild # 將節(jié)點(diǎn)的左節(jié)點(diǎn)當(dāng)作父節(jié)點(diǎn)肄梨,繼續(xù)循環(huán)阻荒,找出所有左節(jié)點(diǎn),并添加到棧中众羡,while循環(huán)結(jié)束表示當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn)沒有左子樹
node = mystack.pop() # 將沒有左節(jié)點(diǎn)的pop出
node = node.rchild # 左子樹遍歷完侨赡,開始遍歷右子樹
# 利用堆棧實(shí)現(xiàn)中序遍歷二叉樹
def inorder_stack(self, root):
if root is None:
return
node = root
mystack = []
while node or mystack:
while node:
mystack.append(node)
node = node.lchild # 這個(gè)while循環(huán)是為了找左子樹為空的節(jié)點(diǎn)
node = mystack.pop() # 左
print(node.data, end=' ') # 根
node = node.rchild # 右
# 利用堆棧實(shí)現(xiàn)后序二叉樹遍歷
def backorder_stack(self, root):
if root is None:
return
node = root
mystack1 = []
mystack2 = []
mystack1.append(node)
while mystack1: # 找出后序遍歷的逆序,并存入mystack2中
node = mystack1.pop()
if node.lchild is not None:
mystack1.append(node.lchild)
if node.rchild is not None:
mystack1.append(node.rchild)
mystack2.append(node)
while mystack2:
print(mystack2.pop().data, end=' ') # 逆序輸出
# 利用隊(duì)列實(shí)現(xiàn)二叉樹的層次遍歷
def level_queue(self, root):
if root is None:
return
myqueue = []
node = root
myqueue.append(node)
while myqueue:
node = myqueue.pop(0) # 先進(jìn)先出
print(node.data, end=' ')
if node.lchild is not None:
myqueue.append(node.lchild)
if node.rchild is not None:
myqueue.append(node.rchild)
s
if __name__ == '__main__':
elems = range(10) # 生成十個(gè)數(shù)據(jù)作為樹節(jié)點(diǎn)
tree = Bitree() # 新建一個(gè)樹對象
for elem in elems:
tree.addnode(elem) # 逐個(gè)添加樹的節(jié)點(diǎn)
print('隊(duì)列實(shí)現(xiàn)層次遍歷:')
tree.level_queue(tree.root)
print('\n\n遞歸實(shí)現(xiàn)先序遍歷:')
tree.preorder_re(tree.root)
print('\n遞歸實(shí)現(xiàn)中序遍歷:')
tree.inorder_re(tree.root)
print('\n遞歸實(shí)現(xiàn)后序遍歷:')
tree.backorder_re(tree.root)
print('\n\n堆棧實(shí)現(xiàn)先序遍歷:')
tree.preorder_stack(tree.root)
print('\n堆棧實(shí)現(xiàn)中序遍歷:')
tree.inorder_stack(tree.root)
print('\n堆棧實(shí)現(xiàn)后序遍歷:')
tree.backorder_stack(tree.root)
'''
二叉樹
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
- 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鲫售,“玉大人共螺,你說我怎么就攤上這事∏橹瘢” “怎么了藐不?”我有些...
- 文/不壞的土叔 我叫張陵,是天一觀的道長秦效。 經(jīng)常有香客問我雏蛮,道長,這世上最難降的妖魔是什么阱州? 我笑而不...
- 正文 為了忘掉前任挑秉,我火速辦了婚禮,結(jié)果婚禮上苔货,老公的妹妹穿的比我還像新娘犀概。我一直安慰自己,他們只是感情好夜惭,可當(dāng)我...
- 文/花漫 我一把揭開白布姻灶。 她就那樣靜靜地躺著,像睡著了一般滥嘴。 火紅的嫁衣襯著肌膚如雪木蹬。 梳的紋絲不亂的頭發(fā)上,一...
- 文/蒼蘭香墨 我猛地睜開眼敛腌,長吁一口氣:“原來是場噩夢啊……” “哼卧土!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起像樊,我...
- 序言:老撾萬榮一對情侶失蹤尤莺,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后生棍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體颤霎,經(jīng)...
- 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
- 正文 我和宋清朗相戀三年涂滴,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了友酱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
- 正文 年R本政府宣布,位于F島的核電站加缘,受9級特大地震影響鸭叙,放射性物質(zhì)發(fā)生泄漏觉啊。R本人自食惡果不足惜拣宏,卻給世界環(huán)境...
- 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望杠人。 院中可真熱鬧勋乾,春花似錦、人聲如沸嗡善。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽罩引。三九已至各吨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間袁铐,已是汗流浹背揭蜒。 一陣腳步聲響...
- 正文 我出身青樓,卻偏偏與公主長得像洒缀,于是被迫代替她去往敵國和親瑰谜。 傳聞我的和親對象是個(gè)殘疾皇子欺冀,可洞房花燭夜當(dāng)晚...
推薦閱讀更多精彩內(nèi)容
- BST樹即二叉搜索樹:1.所有非葉子結(jié)點(diǎn)至多擁有兩個(gè)兒子(Left和Right)仅淑;2.所有結(jié)點(diǎn)存儲(chǔ)一個(gè)關(guān)鍵字称勋;3....
- 簡單來說, 完全二叉樹是指按照層次進(jìn)行遍歷的時(shí)候所得到的序列與滿二叉樹相對應(yīng) 這里提供兩種思路和相應(yīng)的代碼: 1....
- 思路: 從根節(jié)點(diǎn)開始,判斷左右子樹是否是平衡的筐钟,如果都是平衡的揩瞪,則判斷左右子樹的高度差是否不大于1 復(fù)雜度: O(n)
- 樹 概念它是由n(n>0)個(gè)有限節(jié)點(diǎn)組成一個(gè)具有層次關(guān)系的集合妇菱。 特點(diǎn) 每個(gè)節(jié)點(diǎn)有零個(gè)或多個(gè)子節(jié)點(diǎn); 沒有父節(jié)點(diǎn)的...