'''
非完全二叉樹的構(gòu)建和四種遍歷
'''
class Node(object):
'''
定義節(jié)點
'''
def __init__(self,data=None,lchild=None,rchild=None):
self.data = data
self.lchild = lchild
self.rchild = rchild
class BitTree(object):
'''
定義非完全二叉樹
'''
def __init__(self,node=None):
self.root = node
def addNode(self,node=None):
if not (self.root and self.root.data):
self.root = node
my_queque=[self.root]
while my_queque:
cur_node = my_queque.pop(0)
if cur_node == None:
continue
elif not cur_node.lchild :
cur_node.lchild = node
return
elif not cur_node.rchild :
cur_node.rchild = node
return
else:
my_queque.append(cur_node.lchild)
my_queque.append(cur_node.rchild)
#先跟遍歷(遞歸)
def preOrder(self,root):
if root == None:
return
print (root.data)
self.preOrder(root.lchild)
self.preOrder(root.rchild)
#先根遍歷(非遞歸)
def preOrder(self,root):
if not root:
return
stack = [root]
ans = []
while stack:
cur = stack.pop()
ans.append(cur.val)
#注意先添加右孩子,再添加左節(jié)點
if cur.right:
stack.append(cur.right)
if cur.left:
stack.append(cur.left)
return ans
#中跟遍歷(遞歸)
def inOrder(self,root):
if root == None:
return
self.inOrder(root.lchild)
print (root.data)
self.inOrder(root.rchild)
#中跟遍歷(非遞歸)
def inOrder(self,root):
'''
中根遍歷時,用指針cur去遍歷當前節(jié)點的左孩子,如果存在,則將其入棧,繼續(xù)遍歷;
如果不存在,則cur指向棧頂節(jié)點,,訪問棧頂節(jié)點的值,然后遍歷當前節(jié)點的右孩子
'''
if not root:
return
stack = []
ans = []
cur = root
while cur or stack:
if cur :
stack.append(cur)
cur = cur.left
else:
cur = stack.pop()
ans.append(cur.val)
cur = cur.right
return ans
#后跟遍歷(遞歸)
def postOrder(self,root):
if root == None:
return
self.postOrder(root.lchild)
self.postOrder(root.rchild)
print (root.data)
#后跟遍歷(非遞歸)
def postOrder(self,root):
if not root:
return
stack1=[root]
stack2=[]
ans=[]
while stack1:
cur=stack1.pop()
if cur.left:
stack1.append(cur.left)
if cur.right:
stack2.append(cur.right)
while stack2:
cur = stack2.pop()
ans.append(cur.val)
return ans
#層次遍歷
def levelOrder(self,root):
if root==None:
return
my_queque=[root]
while my_queque:
cur_node = my_queque.pop(0)
print (cur_node.data)
if cur_node.lchild:
my_queque.append(cur_node.lchild)
if cur_node.rchild:
my_queque.append(cur_node.rchild)
a=Node("A")
b_tree = BitTree(a)
node_list=["B","E","C",None,"G","F"]
for n in node_list:
nn = Node(n)
b_tree.addNode(nn)
print("----先根--------:")
b_tree.preOrder(b_tree.root)
print("----中根--------:")
b_tree.inOrder(b_tree.root)
print("----后根--------:")
b_tree.postOrder(b_tree.root)
print("----層次--------:")
b_tree.levelOrder(b_tree.root)
python 二叉樹的構(gòu)建與遍歷
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
相關(guān)閱讀更多精彩內(nèi)容
- 開始 結(jié)束 還可以把循環(huán)嵌套的終止條件改為另一種形式,構(gòu)造樹方法如下
- 二叉樹的遍歷 樹的遍歷是樹的一種重要的運算。所謂遍歷是指對樹中所有結(jié)點的信息的訪問,即依次對樹中每個結(jié)點訪問一次且...
- 一、相關(guān)概念 二、題目 題目 思路 利用二叉樹的前序、中序遍歷序列構(gòu)建二叉樹,并遍歷構(gòu)建好的二叉樹。 利用遞歸的思...
- Python小白 Leetcode刷題歷程 No.91-No.95 解碼方法、反轉(zhuǎn)鏈表Ⅱ、復(fù)原IP地址...