資料結構學習之二叉樹

2022-08-31 10:18:07 字數 1431 閱讀 7083

一、為什麼用二叉樹,而不是三個指標域或是根據實際情況指定指標域?

比如3,那麼有n個節點就是有3n個指標域,其中邊只有n條,那麼只有n-1個域非空,有2n+1個域為空,浪費空間。而對於2,那麼就只有n+1個域為空。而比如說根據實際來確定指標域,對於實現上是非常困難的。

度為2的樹就是二叉樹。

斜二叉樹/完美二叉樹(滿二叉樹)/完全二叉樹(是建立在滿二叉樹的基礎上的樹,補齊後就是滿二叉樹,否則順序不一致就不是完全二叉樹)

二、二叉樹特性

1.每層節點個數為當前層數的2的冪次。2的k次方。

2.深度為k的二叉樹最大節點數:2的k次方減去1。

3.對於任何非空二叉樹,葉子節點的個數等於度為2的非葉節點個數加1。(通過檢視樹的邊的個數,n0,n1,n2分別為節點數為012的節點個數,有公式:n0+n1+n2-1=0*n0+1*n1+2*n2*****》推算出:n0=n2+1)

4.樹的遍歷方法:先序,中序,後序,層次遍歷。

三、二叉樹的儲存結構:

1.順序儲存結構

完全二叉樹:由上而下從左到右儲存n個節點的完全二叉樹的節點父子關係:

非根節點的父親節點序號為:i/2(i>1)

節點的左孩子:2i(2i<=n,否則沒有左孩子)

節點右孩子為:2i+1(2i+1<=n,否則沒有右孩子)

一般二叉樹可以採用這種通過陣列來儲存的順序儲存結構,但會造成空間的浪費。

2.鍊錶儲存

class treenode

四、二叉樹的遍歷:

1.先序遍歷

遍歷過程:根節點---》左子樹-----》右子樹

2.中序遍歷:先遞迴左子樹------》根節點----》遍歷右子樹*****=》(注意訪問過程中的非根節點訪問依舊按照此順序)

3.後序遍歷:左子樹---》右子樹---》根節點

這三種遍歷都是在一條線路上只是遍歷的起始位置不同

上面的也是用遞迴思想來遍歷的。

二叉樹的非遞迴遍歷:

中序遍歷非遞迴遍歷演算法: 堆疊

遇到節點就壓如棧,並比**它的左子樹

,當左子樹遍歷結束,從棧頂彈出並訪問它,然後按右子樹再去中序遍歷該節點的右子樹

注:層序遍歷是通過佇列老實現的。將遇到的所有節點的依次右子樹放入佇列,然後按先進先出的原則,一次提取並訪問它的子樹,還是按上述原則一次將資料放入佇列中。就可以實現層序遍歷。

實現應用:輸出葉子節點,可以通過遍歷中的加入if判斷語句,是否有左右子樹,如果沒有就是葉子節點。

高度,二叉樹高度等於左右子樹最大高度加1。遞迴方法求左右子樹高度,判斷最大值然後加1.

二元運算表示式樹和遍歷,

確定乙個二叉樹:先序遍歷和中序遍歷可以,但先序和後序不能確定。

樹的同構:如果兩個樹通過若干次左右孩子互換,就可說這兩顆樹是同構的。

二叉樹的表示,建立二叉樹,同構判別:

二叉樹表示:鍊錶和陣列(按完全二叉樹的思路來表示)靜態鍊錶)

資料結構學習筆記之二叉樹 BST

bst是二叉樹的一種,其中每個結點的左孩子小於該結點的值,右孩子大於於該結點的值,對該樹進行中序遍歷可以得到一組有序序列 二叉搜尋樹 include typedef struct node node typedef struct tree tree void insert tree tree,int...

資料結構學習(1) 二叉樹

二叉樹結構 public class treenode 前序遍歷 根結點,左子樹,右子樹 public static void prenode treenode node,listtreelist 中序遍歷 左子樹,根結點,右子樹 public static void midnode treenod...

資料結構學習筆記 二叉樹

樹,非線性表結構 樹有三個概念 高度從下向上數,起點是0 深度從上向下數,起點是0 層數從上向下數,起點是1 每個節點最多兩個叉 有兩種特殊二叉樹 滿二叉樹,除了葉子節點,每個節點都有左右兩個子節點 完全二叉樹,葉子節點都在最底下兩層,最後一層葉子節點都靠左排列,且除了最後一層,其它層節點個數都達到...