非遞迴遍歷二叉樹

2021-10-02 16:05:15 字數 3205 閱讀 5256

#類名稱:binarytreenode

#類說明:定義乙個二叉樹的結點

#類釋義:分別有左孩子leftchild,右孩子rightchild和資料data

class binarytreenode(object):

def __init__(self):

self.data='#'

self.leftchild=none

self.rightchild=none

class treestate(object):

def __init__(self,binarytreenode,visitedflag):

self.binarytreenode = binarytreenode

self.visitedflag = visitedflag

#類說明:定義乙個二叉樹

class binarytreenonrecursive(binarytreenode):

#建立二叉樹的函式

def createbinarytree(self,root):

data=input('->')

if data=='#':

root=none

else:

root.data=data

root.leftchild=binarytreenode()

self.createbinarytree(root.leftchild)

root.rightchild=binarytreenode()

self.createbinarytree(root.rightchild)

#先序遍歷非遞迴演算法

def preordernonrecursive(self,root):

stacktreenode=

ttreenode=root

while len(stacktreenode)>0 or ttreenode is not none:

while ttreenode is not none:

self.visitbinarytreenode(ttreenode)

ttreenode=ttreenode.leftchild

if len(stacktreenode)>0:

ttreenode=stacktreenode.pop()

ttreenode=ttreenode.rightchild

#中序遍歷非遞迴演算法

def inordernonrecursive(self, root):

stacktreenode =

ttreenode = root

while len(stacktreenode)>0 or ttreenode is not none:

while ttreenode is not none:

ttreenode = ttreenode.leftchild

if len(stacktreenode)>0:

ttreenode = stacktreenode.pop()

self.visitbinarytreenode(ttreenode)

ttreenode = ttreenode.rightchild

#後序遍歷的非遞迴演算法

def postordernonrecursive(self,root):

stacktreenode =

tbinarytreenode = root

ttree = none

while tbinarytreenode is not none:

ttree = treestate(tbinarytreenode,0)

tbinarytreenode = tbinarytreenode.leftchild

while len(stacktreenode)>0:

ttree = stacktreenode.pop()

if ttree.binarytreenode.rightchild is none or ttree.visitedflag == 1:

self.visitbinarytreenode(ttree.binarytreenode)

else:

ttree.visitedflag = 1

tbinarytreenode=ttree.binarytreenode.rightchild

while tbinarytreenode is not none:

ttree = treestate(tbinarytreenode,0)

tbinarytreenode = tbinarytreenode.leftchild

#遍歷二叉樹的乙個結點函式

def visitbinarytreenode(self, binarytreenode):

#值為#的結點代表空結點

if binarytreenode.data is not '#':

print (binarytreenode.data)

#主程式

btnrn = binarytreenode()

btrn = binarytreenonrecursive()

print ('建立一棵二叉樹\n')

print (' 4')

print (' / \\')

print (' 5 6')

print (' / \\ \\')

print (' 1 2 7 ')

print ('4 5 1 # # 2 # # 6 # 7 # #')

#建立一棵二叉樹

print('請仿照上述序列,輸入某一二叉樹中各結點的值(#表示空結點),每輸入乙個值按回車換行:')

btrn.createbinarytree(btnrn)

#非遞迴遍歷二叉樹

print ('對二叉樹進行非遞迴前序遍歷:\n')

#前序遍歷二叉樹

btrn.preordernonrecursive(btnrn)

print ('對二叉樹進行非遞迴中序遍歷:\n')

#中序遍歷二叉樹

btrn.inordernonrecursive(btnrn)

print ('對二叉樹進行非遞迴後序遍歷:\n')

#後序遍歷二叉樹

btrn.postordernonrecursive(btnrn)

二叉樹遍歷(遞迴 非遞迴)

二叉樹以及對二叉樹的三種遍歷 先根,中根,後根 的遞迴遍歷演算法實現,以及先根遍歷的非遞迴實現。node public class node public node left public node right public object value 遍歷訪問操作介面 public inte ce ...

二叉樹非遞迴遍歷

二叉樹非遞迴遍歷的幾個要點 1 不管前序 中序還是後序,它們的遍歷路線 或者說是回溯路線,先沿左邊一直走到盡頭,然後回溯到某節點,並跳轉到該節點的右孩子 如果有的話 然後又沿著這個有孩子的左邊一直走到盡頭 都是一樣的。2 明確每次回溯的目的。比如,前序回溯的目的是為了訪問右子樹 中序回溯的目的是為了...

非遞迴遍歷二叉樹

中序遞迴遍歷 void inordertrvdigui node pnode 然而,當樹的深度很大 比如16 時 假設為滿二叉樹 樹的節點數為 2 0 2 1 2 2 2 15 2 16 65536,遍歷整個二叉樹意味著有65536次函式呼叫,這將極大地增加程式執行時間。這時,應該採取非遞迴便利二叉...