樹是資料結構中非常重要的一種,主要的用途是用來提高查詢效率,對於要重複查詢的情況效果更佳,如二叉排序樹、fp-樹。另外可以用來提高編碼效率,如哈弗曼樹
**:① 樹的構造
② 遞迴實現先序遍歷、中序遍歷、後序遍歷
③ 堆疊實現先序遍歷、中序遍歷、後序遍歷
④ 佇列實現層次遍歷
# -*- coding:utf-8 -*-
class
node
(object):
"""節點類"""
def__init__
(self, elem=-1, lchild=none, rchild=none):
self.elem = elem
self.lchild = lchild
self.rchild = rchild
class
tree
(object):
"""樹類"""
def__init__
(self):
self.root = node()
self.myqueue =
defadd(self, elem):
"""為樹新增節點"""
node = node(elem)
if self.root.elem == -1: # 如果樹是空的,則對根節點賦值
self.root = node
else:
treenode = self.myqueue[0] # 此結點的子樹還沒有齊。
if treenode.lchild == none:
treenode.lchild = node
else:
treenode.rchild = node
self.myqueue.pop(0) # 如果該結點存在右子樹,將此結點丟棄。
deffront_digui
(self, root):
"""利用遞迴實現樹的先序遍歷"""
if root == none:
return
print root.elem,
self.front_digui(root.lchild)
self.front_digui(root.rchild)
defmiddle_digui
(self, root):
"""利用遞迴實現樹的中序遍歷"""
if root == none:
return
self.middle_digui(root.lchild)
print root.elem,
self.middle_digui(root.rchild)
deflater_digui
(self, root):
"""利用遞迴實現樹的後序遍歷"""
if root == none:
return
self.later_digui(root.lchild)
self.later_digui(root.rchild)
print root.elem,
deffront_stack
(self, root):
"""利用堆疊實現樹的先序遍歷"""
if root == none:
return
mystack =
node = root
while node or mystack:
while node: #從根節點開始,一直找它的左子樹
print node.elem,
node = node.lchild
node = mystack.pop() #while結束表示當前節點node為空,即前乙個節點沒有左子樹了
node = node.rchild #開始檢視它的右子樹
defmiddle_stack
(self, root):
"""利用堆疊實現樹的中序遍歷"""
if root == none:
return
mystack =
node = root
while node or mystack:
while node: #從根節點開始,一直找它的左子樹
node = node.lchild
node = mystack.pop() #while結束表示當前節點node為空,即前乙個節點沒有左子樹了
print node.elem,
node = node.rchild #開始檢視它的右子樹
deflater_stack
(self, root):
"""利用堆疊實現樹的後序遍歷"""
if root == none:
return
mystack1 =
mystack2 =
node = root
while mystack1: #這個while迴圈的功能是找出後序遍歷的逆序,存在mystack2裡面
node = mystack1.pop()
if node.lchild:
if node.rchild:
while mystack2: #將mystack2中的元素出棧,即為後序遍歷次序
print mystack2.pop().elem,
deflevel_queue
(self, root):
"""利用佇列實現樹的層次遍歷"""
if root == none:
return
myqueue =
node = root
while myqueue:
node = myqueue.pop(0)
print node.elem,
if node.lchild != none:
if node.rchild != none:
if __name__ == '__main__':
elems = range(7) #生成十個資料作為樹節點
print elems
tree = tree() #新建乙個樹物件
for elem in elems:
tree.add(elem) #逐個新增樹的節點
print
'佇列實現層次遍歷:'
tree.level_queue(tree.root)
print
'\n\n遞迴實現先序遍歷:'
tree.front_digui(tree.root)
print
'\n遞迴實現中序遍歷:'
tree.middle_digui(tree.root)
print
'\n遞迴實現後序遍歷:'
tree.later_digui(tree.root)
print
'\n\n堆疊實現先序遍歷:'
tree.front_stack(tree.root)
print
'\n堆疊實現中序遍歷:'
tree.middle_stack(tree.root)
print
'\n堆疊實現後序遍歷:'
tree.later_stack(tree.root)
輸出結果
[0, 1, 2, 3, 4, 5, 6]
佇列實現層次遍歷:
0 1 2 3 4 5 6
遞迴實現先序遍歷:
0 1 3 4 2 5 6
遞迴實現中序遍歷:
3 1 4 0 5 2 6
遞迴實現後序遍歷:
3 4 1 5 6 2 0
堆疊實現先序遍歷:
0 1 3 4 2 5 6
堆疊實現中序遍歷:
3 1 4 0 5 2 6
堆疊實現後序遍歷:
3 4 1 5 6 2 0
二叉樹及二叉樹的遍歷
二叉樹的定義 樹的度為2的樹。二叉樹的遞迴定義 二叉樹或者是一棵空樹,或者是一棵由乙個根結點和兩棵互不相交的左子樹和右子樹所組成的非空樹,而左右子樹又都是一棵二叉樹。1.第i層上至多有2的i 1次方個結點。2.深度為h的二叉樹至多有2的h次方減1個結點。3.每一層都滿的二叉樹稱為滿二叉樹,只在最後一...
二叉樹的實現及遍歷
二叉樹是一種非常重要的資料結構,接下來看看如何用 來實現二叉樹,以及二叉樹的插入和遍歷。public class node public void add int s elseif int this value s 將s插入到本節點的左子樹 leftnode.add s else rightnode...
python 二叉樹構造及遍歷
二叉樹 binary tree 是一種樹狀結構,每個節點最多有兩個子樹,並且分為左 右兩個子樹。class treenode object def init self,data,left none right none self.data data self.left left self.right...