二叉樹的儲存結構與遞迴遍歷方式

2021-08-18 21:15:14 字數 2266 閱讀 6175

二叉樹可以看成是乙個有窮結點的集合,由根節點和其互不相交的左子樹和右子樹組成,所以二叉樹的度等於2。(但是注意不是所有度為

2的樹都是二叉樹。)

二叉樹有斜二叉樹:

也就是只有左子樹或者右子樹,它的另乙個指標域為空,這樣的二叉樹其實就是乙個鍊錶。

如果既有左子樹又有右子樹,像這樣的情況,成為完美二叉樹:

也就是除了葉結點外,每乙個結點都有左子樹和右子樹,葉節點是比較齊的,處於同一層。

對於二叉樹的操作,這裡講一些最基本的操作有:

1、建立乙個二叉樹;

2、判斷二叉樹是否為空;

3、遍歷二叉樹;

其中第三點遍歷二叉樹十分重要,因為在樹的操作中,很多時候都要遍歷訪問資料。至於樹的遍歷方式在這裡先講三種遞迴的方式:

1、先序遍歷:依次按根、左子樹、右子樹的順序遍歷。

2、中序遍歷:依次按左子樹、根、右子樹的順序遍歷。

3、後序遍歷:依次按左子樹、右子樹、根的順序遍歷。

接下來先看二叉樹的儲存方式後,再來實現二叉樹的遍歷。一般的二叉樹可以用這樣的結構來表示:

一共三個域,乙個data表示資訊,乙個

left

結構指標和乙個

right

結構指標表示左子樹結點和右子樹結點。

儲存完後接下來到遍歷,首先來看先序遍歷,先序遍歷的過程是先訪問根結點,接著按照先序遍歷的原則遍歷根節點之後的左子樹,再遍歷右子樹,這樣遍歷可以用遞迴的方式。因為按照先序遍歷的原則(先訪問根節點,接著遍歷左子樹再遍歷右子樹),我們可以用遞迴的方式,遞迴的遍歷左子樹後,再遞迴的遍歷右子樹。

所以遞迴的**可以寫成這樣:

函式中傳進去乙個樹bt,在第37行

if先判斷樹是不是空的,不空的話就先訪問根節點(第

38行),這裡的訪問方式也就是把它輸出來看一下。接著就遞迴遍歷左子樹,遞迴完左子樹後再遞迴右子樹。

所以按照這種方法,我們用個例子來看下先序遍歷是怎麼進行的:

一開始進入a根節點,判斷不空後,就輸出a的

data

,然後對左子樹遞迴,也就是對

b子樹以下的進行遍歷,遍歷

b的方法因為同樣是遞迴,判斷

b不空後,輸出

b,然後對左子樹遍歷,再對右子樹遍歷,所以輸出的順序是

abd,輸出完d後,

b的左邊遍歷完了,接著遍歷

b的右邊,

b的右邊同樣的方法先根節點然後從左到右,所以

a的整個左邊遍歷順序是

abdfe

。然後對a的右邊遍歷,方法一樣,所以最後遍歷的順序是

cghi

。這個例子整個遍歷順序就是左+右得

abdfecghi

。接著到中序遍歷:中序遍歷是按左子樹、根、右子樹的順序遍歷,所以顯而易見只要把訪問根的語句放到遞迴左子樹之後就可以了。

同樣那回上面那個例子圖:

顯然,左邊的遍歷順序是dbef,遍歷完左邊後,就訪問根節點

a,接著才到右邊的遍歷,右邊的遍歷按照同樣的方法,所以遍歷順序是

ghci

,整個遍歷順序就是

dbefaghci

。最後到後序遍歷:後序遍歷一樣,依次按左子樹、右子樹、根的順序遍歷。所以把訪問根節點的語句放到最後,也就是放到遍歷右結點的語句之後。

回到上面的例子圖,後序遍歷,先把左子樹遍歷完後,接著遍歷右子樹,最後再訪問根節點a,最後整個遍歷順序就是

defbhgica

二叉樹的遍歷 二叉樹遍歷與儲存

在資料結構中,二叉樹是非常重要的結構。例如 資料庫中經常用到b 樹結構。那麼資料庫是如何去單個查詢或者範圍查詢?首先得理解二叉樹的幾種遍歷順序 先序 中序 後序 層次遍歷。先序 根節點 左子樹 右子樹 中序 左子樹 根節點 右子樹 後序 左子樹 右子樹 根節點 按層級 class node if c...

二叉樹的遍歷方式(遞迴)

二叉樹的遍歷方式 遞迴 部落格摘要 一.什麼是二叉樹 簡述 二叉樹的每個結點至多只有二棵子樹 不存在度大於2的結點 二叉樹的子樹有左右之分,次序不能顛倒。二.四種遍歷 本篇部落格講述二叉樹的四種遍歷 前序遍歷,中序遍歷,後序遍歷,層序遍歷 1.前序遍歷 先訪問當前結點,再訪問當前結點的左子樹結點,最...

二叉樹的遍歷 遞迴方式

概述 用遞迴方式實現二叉樹的遍歷。二叉樹結構 public class node 先序遍歷 先遍歷根結點,再遍歷左子樹,最後遍歷右子樹 public void preorderrecur node head system.out.print head.value 先遍歷根節點 preorderrec...