#類名稱: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次函式呼叫,這將極大地增加程式執行時間。這時,應該採取非遞迴便利二叉...