二叉樹的遍歷方法

2021-06-09 19:53:06 字數 2172 閱讀 9705

二叉樹的遍歷有三種方式,如下:

(1)前序遍歷(dlr),首先訪問根結點,然後遍歷左子樹,最後遍歷右子樹。簡記根-左-右。

(2)中序遍歷(ldr),首先遍歷左子樹,然後訪問根結點,最後遍歷右子樹。簡記左-根-右。

(3)後序遍歷(lrd),首先遍歷左子樹,然後遍歷右子樹,最後訪問根結點。簡記左-右-根。 

例1:如上圖所示的二叉樹,若按前序遍歷,則其輸出序列為      。若按中序遍歷,則其輸出序列為      。若按後序遍歷,則其輸出序列為      。

前序:根a,a的左子樹b,b的左子樹沒有,看右子樹,為d,所以a-b-d。再來看a的右子樹,根c,左子樹e,e的左子樹f,e的右子樹g,g的左子樹為h,沒有了結束。連起來為c-e-f-g-h,最後結果為abdcefgh

中序:先訪問根的左子樹,b沒有左子樹,其有右子樹d,d無左子樹,下面訪問樹的根a,連起來是bda。

再訪問根的右子樹,c的左子樹的左子樹是f,f的根e,e的右子樹有左子樹是h,再從h出發找到g,到此c的左子樹結束,找到根c,無右子樹,結束。連起來是fehgc,  中序結果連起來是bdafehgc

後序:b無左子樹,有右子樹d,再到根b。再看右子樹,最下面的左子樹是f,其根的右子樹的左子樹是h,再到h的根g,再到g的根e,e的根c無右子樹了,直接到c,這時再和b找它們其有的根a,所以連起來是dbfhgeca。

看起來比較麻煩,簡單方法如下:

遍歷序列

1.遍歷二叉樹的執行蹤跡

三種遞迴遍歷演算法的搜尋路線相同(如下圖虛線所示)。

具體線路為:

從根結點出發,逆時針沿著二叉樹外緣移動,對每個結點均途徑三次,最後回到根結點。

2.遍歷序列

(1) 中序序列

中序遍歷二叉樹時,對結點的訪問次序為中序序列

【例】中序遍歷上圖所示的二叉樹時,得到的中序序列為:

d b a e c f

(2) 先序序列

先序遍歷二叉樹時,對結點的訪問次序為先序序列

【例】先序遍歷上圖所示的二叉樹時,得到的先序序列為:

a b d c e f

(3) 後序序列

後序遍歷二叉樹時,對結點的訪問次序為後序序列

【例】後序遍歷上圖所示的二叉樹時,得到的後序序列為:

d b e f c a

注意:(1) 在搜尋路線中,若訪問結點均是第一次經過結點時進行的,則是前序遍歷;若訪問結點均是在第二次(或第三次)經過結點時進行的,則是中序遍歷(或後序遍歷)。只要將搜尋路線上所有在第一次、第二次和第三次經過的結點分別列表,即可分別得到該

二叉樹的前序序列、中序序列和後序序列。

(2) 上述三種序列都是線性序列,有且僅有乙個開始結點和乙個終端結點,其餘結點都有且僅有乙個前趨結點和乙個後繼結點。為了區別於樹形結構中前趨(即雙親)結點和後繼(即孩子)結點的概念,對上述三種線性序列,要在某結點的前趨和後繼之前冠以

其遍歷次序名稱。

【例】上圖所示的二叉樹中結點c,其前序前趨結點是d,前序後繼結點是e;中序前趨結點是e,中序後繼結點是f;後序前趨結點是f,後序後繼結點是a。但是就該樹的邏輯結構而言,c的前趨結點是a,後繼結點是e和f。

二叉鍊錶的構造

1. 基本思想

基於先序遍歷的構造,即以二叉樹的先序序列為輸入構造。

注意:先序序列中必須加入虛結點以示空指標的位置。

【例】建立上圖所示二叉樹,其輸入的先序序列是:abd∮∮ce∮∮f∮∮。

2. 構造演算法

假設虛結點輸入時以空格字元表示,相應的構造演算法為:

void createbintree (bintree *t)

{ //構造二叉鍊錶。t是指向根指標的指標,故修改*t就修改了實參(根指標)本身

char ch;

if((ch=getchar())=='') *t=null; //讀人空格,將相應指標置空

else{ //讀人非空格

*t=(bintnode *)malloc(sizeof(bintnode)); //生成結點

(*t)->data=ch;

createbintree(&(*t)->lchild); //構造左子樹

createbintree(&(*t)->rchild); //構造右子樹

注意:呼叫該演算法時,應將待建立的二叉鍊錶的根指標的位址作為實參。

二叉樹遍歷方法

二叉樹簡介 二叉樹是每個節點最多有兩個子樹的樹結構。通常被稱作左子樹 left subtree 和右子樹 right subtree 二叉樹常被用於實現二叉查詢樹二叉堆。二叉樹 深度為k 並且有2 k 1個節點的二叉樹稱為滿二叉樹。這種樹的特點是每一層的節點數都是最大節點數。而且在一棵二叉樹中,除最...

二叉樹的遍歷方法

include include include using namespace std typedef struct node bintree typedef struct node1 btnode void preorder1 bintree root 遞迴前序遍歷 void inorder1 b...

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

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