二叉樹 樹的建立和遍歷

2022-05-30 21:36:13 字數 4237 閱讀 6668

前面介紹的鍊錶,棧,佇列都是一種順序容器,訪問元素的時候都是通過位置來訪問的。如果想要通過值的方式來獲取資料,只能通過遍歷的方式。這在時間上消耗比較大。而二叉樹可以做到不用遍歷就可以通過值的方式來獲取資料。二叉樹是按值來儲存元素,也按值來訪問元素。

樹的結點:包含乙個資料元素及若干指向子樹的分支;

孩子結點:結點的子樹的根稱為該結點的孩子;

雙親結點:b 結點是a 結點的孩子,則a結點是b 結點的雙親;

兄弟結點:同一雙親的孩子結點; 堂兄結點:同一層上結點;

祖先結點: 從根到該結點的所經分支上的所有結點子孫結點:以某結點為根的子樹中任一結點都稱為該結點的子孫

結點層:根結點的層定義為1;根的孩子為第二層結點,依此類推;

樹的深度:樹中最大的結點層

結點的度:結點子樹的個數

樹的度: 樹中最大的結點度。

葉子結點:也叫終端結點,是度為 0 的結點;

分枝結點:度不為0的結點;

有序樹:子樹有序的樹,如:家族樹;

無序樹:不考慮子樹的順序;[3]

二叉樹的定義:

二叉樹是每個節點最多有兩個子樹的樹結構。通常子樹被稱作「左子樹」(left subtree)和「右子樹」(right subtree)。二叉樹常被用於實現二叉查詢樹和二叉堆。

二叉樹的每個結點至多只有二棵子樹(不存在度大於2的結點),二叉樹的子樹有左右之分,次序不能顛倒。二叉樹的第i層至多有2^(i-1)個結點;深度為k的二叉樹至多有2^k-1個結點;對任何一棵二叉樹t,如果其終端結點數為n_0,度為2的結點數為n_2,則n_0=n_2+1。

若設二叉樹的高度為h,除第 h 層外,其它各層 (1~h-1) 的結點數都達到最大個數,第h層有葉子節點,並且葉子結點都是從左到右依次排布,這就是完全二叉樹。

一棵深度為k,且有2^k-1個節點的二叉樹,稱為滿二叉樹。

這種樹的特點是每一層上的節點數都是最大節點數。

而在一棵二叉樹中,除最後一層外,若其餘層都是滿的,並且最後一層或者是滿的,或者是在右邊缺少連續若干節點,則此二叉樹為完全二叉樹。

具有n個節點的完全二叉樹的深度為log2n+1。深度為k的完全二叉樹,至少有2^(k-1)個節點,至多有2^k-1個節點。

二叉樹的性質:

性質1:二叉樹第i層上的結點數目最多為2(i≥1)。

性質2:深度為k的二叉樹至多有2-1個結點(k≥1)。

性質3:包含n個結點的二叉樹的高度至少為log2(n+1)

性質4:在任意一棵二叉樹中,若終端結點的個數為n0,度為2的結點數為n2,則n0=n2+1

完全二叉樹的性質:假設有n個節點

如果i=1,則結點i是二叉樹的根

如果i>1,則其雙親結點是i/2

如果2i<=n,則結點的左孩子為2i

如果2i>n,則結點i無左孩子

如果2i+1<=n, 則結點i的右孩子為2i+1

如果2i+1>n,則結點i無右孩子。

遍歷二叉樹:

有三種遍歷方式:1 

先根序遍歷 

2 中根序遍歷 

3 後根序遍歷

1 先根序遍歷:先訪問根結點,而後以同樣方式順序遍歷左子樹和右子樹

2 中根序遍歷:先以同樣方式遍歷左子樹,然後訪問根結點,最後再以同樣的方式遍歷右子樹

3 後根序遍歷:先以同樣方式遍歷左右子樹,最後訪問根結點

比如下面這張圖:

先根序遍歷的順序 1->2->4->5->7->3->6

中根序遍歷的順序 4->2->7->5->1->3->6

後根序遍歷的順序 4->7->5->2->6->3->1

下面來看下如何建立二叉樹和層次遍歷乙個二叉樹

class tree():

def __init__(self):

self.root=none

self.result=

self.q=

def add(self,elem):

node=node(elem)

if self.root is none:

self.root=node

else:

q=[self.root]

while true:

pop_node=q.pop(0)

if pop_node.lchild is none:

pop_node.lchild=node

return

if pop_node.rchild is none:

pop_node.rchild = node

return

else:

#基於佇列的層次遍歷

def level_print(self):

if self.root == none:

return 'empyt tree'

while true:

if len(self.q) > 0:

current = self.q.pop(0)

if current.lchild != none:

if current.rchild != none:

else:

break

print self.result

if __name__=="__main__":

elems=range(10)

tree=tree()

for elem in elems:

tree.add(elem)

tree.level_print()

列印結果:

/usr/bin/python2.7 /home/zhf/py_prj/data_struct/chapter6.py

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

先根遍歷,中根遍歷,後根遍歷的實現

def pre_order(tree):

if tree == none:

return 'empyt tree'

print tree.elem

pre_order(tree.lchild)

pre_order(tree.rchild)

def middle_order(tree):

if tree == none:

return 'empty tree'

middle_order(tree.lchild)

print tree.elem

middle_order(tree.rchild)

def post_order(tree):

if tree == none:

return 'empty tree'

post_order(tree.lchild)

post_order(tree.rchild)

print tree.elem

執行結果:

/usr/bin/python2.7 /home/zhf/py_prj/data_struct/chapter6.py

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

pre_order

middle_order

post_order

二叉樹建立和遍歷

二叉樹建立遍歷規則 1.先序 根 左 右 2.中序 左 根 右 3.後序 左 右 根 二叉樹定義和輔助函式如下 struct node void visit int data int indata 先序建立二叉樹 struct node createbitree 先序建立乙個二叉樹 return t...

二叉樹建立和遍歷

include include 帶返回值建立二叉樹 最簡單方法 節點資料結構 struct bs node typedef struct bs node tree tree head,p,root 建立二元查詢樹 有返回值的可以不傳參 沒有的話如何傳參 輸入0代表到了某個葉子節點 tree crea...

二叉樹建立和遍歷

二叉樹建立遍歷規則 1.先序 根 左 右 2.中序 左 根 右 3.後序 左 右 根 二叉樹定義和輔助函式例如以下 struct node void visit int data int indata 先序建立二叉樹 struct node createbitree 先序建立乙個二叉樹 return...