python實現二叉樹及其遍歷

2021-08-28 02:54:42 字數 3426 閱讀 4637

class node():

def __init__(self,data=-1):

self.data=data

self.left=none

self.right=none

class tree():

def __init__(self):

self.root=node()

def add(self, data):

# 為樹加入節點

node = node(data)

if self.root.data == -1: # 如果樹為空,就對根節點賦值

self.root = node

else:

myqueue =

treenode = self.root

while myqueue: # 對已有的節點進行層次遍歷

treenode = myqueue.pop(0)

if not treenode.left:

treenode.left = node

return

elif not treenode.right:

treenode.right = node

return

else:

def pre_order_recursion(self,root): # 遞迴實現前序遍歷

if not root:

return

print(root.data)

self.pre_order_recursion(root.left)

self.pre_order_recursion(root.right)

def pre_order_stack(self,root):#堆疊實現前序遍歷(非遞迴)

if not root:

return

mystack=

node=root

while mystack or node:

while node: # 從根節點開始,一直尋找他的左子樹

print(node.data)

node=node.left

node=mystack.pop()# while結束表示當前節點node為空,即前乙個節點沒有左子樹了

node=node.right #開始檢視它的右子樹

def in_order_recursion(self,root):# 遞迴實現中序遍歷

if not root:

return

self.in_order_recursion(root.left)

print(root.data)

self.in_order_recursion(root.right)

def in_order_stack(self,root):# 堆疊實現中序遍歷(非遞迴)

if not root:

return

mystack=

node=root

while node or mystack:# 從根節點開始,一直尋找它的左子樹

while node:

node=node.left

node=mystack.pop()

print(node.data)

node=node.right

def post_order_recursion(self,root): # 遞迴實現後序遍歷

if not root:

return

self.post_order_recursion(root.left)

self.post_order_recursion(root.right)

print(root.data)

def post_order_stack(self,root): # 堆疊實現後序遍歷(非遞迴)

# 先遍歷根節點,再遍歷右子樹,最後是左子樹,這樣就可以轉化為和先序遍歷乙個型別了,最後只把遍歷結果逆序輸出就ok了

if not root:

return

mystack1=

mystack2=# stack2是為了逆序輸出

node=root

while node or mystack1:

while node:

node=node.right

node=mystack1.pop()

node=node.left

while mystack2:

print(mystack2.pop().data)

def level_order_queue(self,root):# 佇列實現層次遍歷(非遞迴)

if not root:

return

myqueue=

node=root

while myqueue:

node=myqueue.pop(0)

print(node.data)

if node.left:

if node.right:

if __name__ == '__main__':

# 主函式

datas = [1, 2, 3, 4]

tree = tree() # 新建乙個樹物件

for data in datas:

tree.add(data) # 逐個加入樹的節點

print('遞迴實現前序遍歷:')

tree.pre_order_recursion(tree.root)

print('\n堆疊實現前序遍歷')

tree.pre_order_stack(tree.root)

print("\n\n遞迴實現中序遍歷:")

tree.in_order_recursion(tree.root)

print("\n堆疊實現中序遍歷:")

tree.in_order_stack(tree.root)

print('\n\n遞迴實現後序遍歷:')

tree.post_order_recursion(tree.root)

print('\n堆疊實現後序遍歷:')

tree.post_order_stack(tree.root)

print('\n\n佇列實現層次遍歷:')

tree.level_order_queue(tree.root)

結果:

d:\anaconda\python.exe e:/pythonwork/python實現二叉樹及其遍歷.py

遞迴實現前序遍歷:12

43堆疊實現前序遍歷12

43遞迴實現中序遍歷:42

13堆疊實現中序遍歷:42

13遞迴實現後序遍歷:42

31堆疊實現後序遍歷:42

31佇列實現層次遍歷:12

34process finished with exit code 0

二叉樹及其遍歷

滿二叉樹肯定是完全二叉樹,完全二叉樹不一定是滿二叉樹 二叉樹的遍歷 先序遍歷 也叫做先根遍歷 前序遍歷,首先訪問根結點然後遍歷左子樹,最後遍歷右子樹。在遍歷左 右子樹時,仍然先訪問根結點,然後遍歷左子樹,最後遍歷右子樹,如果二叉樹為空則返回。中序遍歷 首先遍歷左子樹,然後訪問根結點,最後遍歷右子樹。...

二叉樹及其遍歷

二叉樹是乙個很重要的儲存結構,所以和大家分享一下我對二叉樹的理解並結合 希望讓大家都能對二叉樹有乙個最清晰的認識 首先,二叉樹是每個節點最多有兩個子樹的樹結構,這是二叉樹的定義,二叉樹的結構如下圖 可以看到二叉樹必要的是根節點,也就是a,每個節點都會有左子節點和右子節點,那麼從b開始看,它又是乙個二...

二叉樹及其應用 二叉樹遍歷

給定二叉樹的廣義表表示,構造二叉樹並輸出二叉樹的四種遍歷順序。輸入說明 輸入僅一行,該行僅由 以及大小寫字元構成的二叉樹的廣義表表示,字串長度不超過100。輸出說明 在接下來的四行中依行輸出二叉樹的四種遍歷 輸入樣列 a b d,c e,f h 輸出樣列 abdcefh dbaecfh dbehfc...