二叉樹的儲存結構及遍歷演算法

2021-08-10 03:03:29 字數 1518 閱讀 1145

二叉樹的順序儲存:

用一塊連續的空間儲存二叉樹的節點,儲存的順序按從上到下,從左至右的順序。

順序儲存一般適合儲存 : 滿二叉樹和完全二叉樹。 

對於一般二叉樹,如果用順序儲存,且需要反映出一定的邏輯關係(即能用陣列元素下標值反映元素在二叉樹中的位置),此時可能會需要定義一些虛結點。即儲存時,儲存虛結點的空間即儲存0值。(弊端是浪費了太多空間)所以,對於一般二叉樹不適合用順序儲存結構。

二叉樹的鏈式儲存: 用鍊錶來表示一棵二叉樹

1二叉鍊錶儲存結構: 鍊錶每個結點包含兩個指標域(分別指向 左孩子結點和右孩子結點)以及資料域。 ,當左孩子或右孩子不存在時將對應的指標域設為null。

2三叉鍊錶儲存結構:鍊錶每個結點包含三個指標域(分別指向左孩子結點和右孩子結點以及雙親結點)以及資料域。

二叉樹是最常用二叉樹儲存結構(對於一般的二叉樹,二叉鍊錶儲存結構甚至比順序儲存結構還要節省儲存空間)。

含有n個結點的二叉鍊錶中含有n+1個空指標域。  設深度為k , 則最後一層的結點數為 2^(k-1)  , 總結點數為 2^k-1 ,由於每個結點含有兩個指標域,故有2*2^(k-1)+1個空指標域,即 為 n+1 此為特殊情況。

正常推導為:由於n個結點有2n個指標域,但是只需要儲存n-1個結點的資訊,所以有n+1個指標域會空閒。

二叉樹的靜態鍊錶儲存結構,和靜態鍊錶一樣是為了那些不支援指標型別的程式語言。

二叉樹的正則化擴充套件:當結點存在乙個子結點,但無另外的乙個左或右孩子結點時,補充乙個虛結點,使原二叉樹的結點都稱為分支結點,這種補充稱為二叉樹的正則化擴充套件。

二叉樹的遍歷演算法:遞迴過程。

先序遍歷: 1、先訪問根結點 ;2、先序遍歷根結點的左子樹;3、先序遍歷根結點的右子樹。

中序遍歷: 1、中序遍歷根結點的左子樹;2、訪問根結點;3、中序遍歷根結點的右子樹。

後序遍歷: 1、後序遍歷根結點的左子樹;2、後序遍歷根結點的右子樹;3、訪問根結點。 /

二叉樹的非遞迴遍歷演算法:

先序遍歷: 實質上就是進棧出棧的過程。

void preorder(bitree bt , *visit( elemtype))

//棧是先進後出,所以先進棧右孩子結點。 }

} ///

中序遍歷:同理

void inorder(bitree bt,*visit(elemtype))

else   }

} }///

後序遍歷:

postorder(bitree bt ,*visit(elemtype))

while( top && tag[top]==1)

if(top)

//因為已經到了左子樹的葉子結點,此時p指向葉子結點的左孩子結點,且其指標為null,故此時應該訪問棧里根結點的右子樹結點。 }

}/// //

層次遍歷:從上到下,每層從左至右訪問結點。 先遇到的先訪問,其符合佇列的特性。

演算法描述:

levelorder(bitree bt ,*visit(elemtype))

}

二叉樹儲存及遍歷

二叉樹儲存及遍歷 1 樹的儲存 注意 樹的深度是從根節點開始 其深度為1 自頂向下逐層累加的,而高度是從葉節點開始 其高度為1 自底向上逐層累加的。雖然樹的深度和高度一樣,但是具體到樹的某個節點,其深度和高度是不一樣的。我的理解是 非根非葉結點的深度是從根節點數到它的,高度是從葉節點數到它的。二叉樹...

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

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

二叉樹及二叉樹的遍歷

二叉樹的定義 樹的度為2的樹。二叉樹的遞迴定義 二叉樹或者是一棵空樹,或者是一棵由乙個根結點和兩棵互不相交的左子樹和右子樹所組成的非空樹,而左右子樹又都是一棵二叉樹。1.第i層上至多有2的i 1次方個結點。2.深度為h的二叉樹至多有2的h次方減1個結點。3.每一層都滿的二叉樹稱為滿二叉樹,只在最後一...