學了幾章的資料結構,我發現每一章對結構的闡述都會有以下三個步驟:
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個字元的字串。...