二叉樹的實現和遍歷

2021-08-26 04:46:00 字數 1090 閱讀 6026

性質1、在二叉樹的第i層上至多有2^(i-1)個結點;

性質2、深度為k的二叉樹至多有2^k-1個結點;

性質3、對任何一棵二叉樹,如果其終端節點數為n0,度為2的結點數為n2,則n0=n2+1;

性質4、具有n個節點的完全二叉樹的深度為[logn]+1 ,這裡[ ]表示向下取整。

性質5、對一棵有n個節點的完全二叉樹的結點按層序編號(從上往下,自左而右),則對任一結點i(1<=i<=n),有

a、如果i=1,則結點i是二叉樹的根,無雙親;如果i>1,則其雙親parent(i)=[i/2],這裡[ ]表示向下取整。

b、如果2i>n,則結點i無左孩子(即終端結點),否則其左孩子lchild(i)=2i;

c、如果2i+1>n,則結點i無右孩子,否則其右孩子rchild(i)=2i+1。

二叉樹的儲存結構也可以有順序儲存和鏈式儲存兩種。

順序儲存適合完全二叉樹,對完全二叉樹進行編號,編號為i的結點儲存在第(i-1)個儲存單元中。但對一般二叉樹採用順序儲存結構,空樹也要占用儲存單元,會浪費儲存空間。

鏈式儲存又包括二叉鍊錶和三叉鍊錶,前者有2個指標域,分別指向左、右孩子,而三叉鍊錶有3個指標域,多出1個指向雙親結點的指標。

二叉樹的遞迴遍歷演算法可以分為先序遍歷、中序遍歷、後序遍歷。假如以l、d和r分別表示遍歷左子樹、訪問根結點和遍歷右子樹,則:

先序遍歷:dlr

中序遍歷:ldr

後續遍歷:lrd

不論按哪一種次序進行遍歷,對含有n個結點的二叉樹,其時間複雜度均為o(n)。

遍歷二叉樹是以一定規則將二叉樹中結點排列成乙個線性序列,這實質上是對乙個非線性序列進行線性化操作,使每個結點在這個線性序列中有且僅有乙個直接前驅和後繼。在二叉鍊錶中,我們只能得到每個結點的左右孩子資訊,而不能得到結點在某次有序遍歷中的直接前驅和後繼。乙個最簡單的辦法是在每個結點上增加兩個指標域fwd和bkwd,分別指示結點在任一次序遍歷時得到的前驅和後繼資訊,但這樣做會大大降低使結構的儲存密度。我們知道,含有n個結點的二叉鍊錶存在n+1個空鏈域(由於n0=n2+1,因此2n0+n1=n0+n1+n2+1=n+1)。利用這些空鏈域儲存其他有用資訊,可以得到線索鍊錶,如下圖所示。

二叉樹的實現和遍歷

性質1 在二叉樹的第i層上至多有2 i 1 個結點 性質2 深度為k的二叉樹至多有2 k 1個結點 性質3 對任何一棵二叉樹,如果其終端節點數為n0,度為2的結點數為n2,則n0 n2 1 性質4 具有n個節點的完全二叉樹的深度為 logn 1 這裡 表示向下取整。性質5 對一棵有n個節點的完全二叉...

二叉樹的實現和遍歷

雖然已經從事程式設計快4年了,但是由於不是科班出身,存在很多的弱點,尤其是最近的開發過程中,一旦遇到複雜點的對應關係就有氣無力的,有點時間就補一下基礎知識吧。查詢二叉樹的實現和幾種遍歷方法 參考 資料結構與演算法分析c 描述 原始碼 二叉樹實現 pragma once include include...

二叉樹的遍歷和線索二叉樹

二叉樹的遍歷,所謂二叉樹的遍歷,是指按某條搜尋路徑訪問樹中的每個結點,使得每個結點均被訪問一次,而且僅被訪問一次。由二叉樹的遞迴定義可知,遍歷一棵二叉樹便要決定對根結點n,左子樹l和右子樹r的訪問順序。按照先遍歷再遍歷右子樹的原則,常見的遍歷次序有先,中,後三種遍歷方法,其中序指的是根結點再何時被訪...