資料結構 二叉樹(1)遍歷,建立,應用

2021-06-21 21:30:23 字數 1823 閱讀 9155

學了幾章的資料結構,我發現每一章對結構的闡述都會有以下三個步驟:

1.先定義資料結構和基本操作。就是所謂的抽象,把像的總體特徵抽出來,有的也會去歸納出結構的性質。

2.資料結構的儲存,一般分為順序儲存結構和鏈式儲存結構。

3.根據儲存結構來建立資料結構和給出實現各種操作的演算法。

同樣對二叉樹的總結,我也用這種方法來組織吧。

1.二叉樹的定義

(1)每個結點的度都不大於2;

(2)每個結點的孩子結點次序不能任意顛倒;

2.二叉樹的儲存結構

(1)順序儲存結構

將二叉樹中編號為i的結點存放在陣列的第i個分量中,可得結點i的左孩子位置為2*i;右孩子的位置為2*i+1。

優點:對於完全二叉樹來說非常方便。

缺點:對於一般二叉樹,必須用「虛結點」將其補成一顆「完全二叉樹」來儲存,由於編號為i的結點存放在i分量中,這就導致「虛結點」空間的浪費。

(2)鏈式儲存結構

因為對於二叉樹來說,每個結點都有左右孩子結點和雙親結點。可以設計每個結點包括三個域:資料域,左孩子域,右孩子域。分別存放結點資料,指向左孩子結點的指標,指向右孩子結點的指標。這樣在建立二叉樹時用遞迴方法,先建立根結點,再建立全部的左子樹,後建立全部右子樹。這時候在執行輸入時也要按照建立的形式去輸入,看是先序遍歷建立還是其他的。(下面建立二叉樹時講)。

typedef struct node

bitnode, *bitree;

3.二叉樹的基本操作

先講二叉樹的遍歷,再由遍歷來引出二叉樹的建立,因為二叉樹也是利用遞迴遍歷的形式來建立的。

(1)按照先左後右的的順序分為三種:

先序遍歷

void  preorder(bitree root) 

/*先序遍歷二叉樹, root為指向二叉樹(或某一子樹)根結點的指標*/

}

中序遍歷

void  inorder(bitree root)  

/*中序遍歷二叉樹, root為指向二叉樹(或某一子樹)根結點的指標*/

}

後續遍歷

void  postorder(bitree root)  

/* 後序遍歷二叉樹,root為指向二叉樹(或某一子樹)根結點的指標*/

}

(2)建立二叉樹

#include #include #include typedef char datatype;

typedef struct node

bitnode, *bitree;

void createbitree(bitree *bt)

}

按照上述**建立二叉樹,如建立下圖這樣的二叉樹,使用者輸入的格式應該是abd.g...ce..f..【enter】。

(3)二叉樹遍歷的應用

需求:遍歷二叉樹並把每個結點的值和層數列印出來。

**如下:

#include "bittree.h"

void visit(datatype data,int layer)

void printlayer(bitree t,int layer)

}void main()

執行結果為:

資料結構實驗之二叉樹二 遍歷二叉樹

time limit 1000ms memory limit 65536k 已知二叉樹的乙個按先序遍歷輸入的字串行,如abc,de,g,f,其中,表示空結點 請建立二叉樹並按中序和後序的方式遍歷該二叉樹。連續輸入多組資料,每組資料輸入乙個長度小於50個字元的字串。每組輸入資料對應輸出2行 第1行輸出...

資料結構實驗之二叉樹二 遍歷二叉樹

剛開始學樹,不是很明白遞迴的過程,後來才發現了乙個比較好理解遞迴的方法 你不需要把所有遞迴的過程都呈現在腦海裡,你只需要畫出遞迴的其中乙個過程就可以了,這乙個過程的遞迴如果正確了,那麼下面的遞迴過程是百分之百正確的,當然還有乙個點就是要明確遞迴的終點,也就是返回條件,這一點很重要,如果這個遞迴的外部...

資料結構實驗之二叉樹二 遍歷二叉樹

資料結構實驗之二叉樹二 遍歷二叉樹 time limit 1000ms memory limit 65536k 已知二叉樹的乙個按先序遍歷輸入的字串行,如abc,de,g,f,其中,表示空結點 請建立二叉樹並按中序和後序的方式遍歷該二叉樹。連續輸入多組資料,每組資料輸入乙個長度小於50個字元的字串。...