資料結構 二叉樹

2022-08-31 18:27:09 字數 1432 閱讀 6269

要研究二叉查詢樹(binary search tree)首先要熟悉二叉樹(binary tree)的概念與性質,二叉查詢樹是在二叉樹基礎上衍生出的資料結構。

二叉樹是一棵樹,其中每個節點都不能有多於兩個(<=2)的兒子。二叉樹的乙個性質是平均二叉樹的深度要比n小得多。分析表明,這個平均深度為o(√n),而對於特殊的二叉樹,即二叉查詢樹,其深度的平均值是o(logn)。但是二叉樹的深度也是可以達到n-1的(所有的節點都在同一側,最壞情況)。

因為二叉樹中的節點最多有兩個兒子,因此可以直接用指標指向它們。二叉樹中的節點就是由key(關鍵字)資訊加上兩個指向其他節點的指標(left和right)組成的結構。特別的,在插入乙個節點時,必須使用malloc來建立乙個節點,當刪除節點時,使用free釋放節點所占用的空間。具有n個節點的每一棵二叉樹都將需要n+1個null指標。二叉樹的宣告如下所示:

typedef struct treenode *ptrtonode;

typedef struct ptrtonode tree;

struct treenode

elementtype element;

tree      left;

tree      right;

二叉樹除了可以用於查詢(主要是二叉查詢樹)之外,在編譯器設計領域也有很重要的應用,典型的應用為處理表示式。二叉樹可以用來表達乙個算術表示式,稱為表示式樹,其中非葉節點儲存操作符,葉節點儲存運算元。(只考慮簡單的情況,即表示式中都是二元操作的情況。)可以通過遞迴計算左右表示式樹的值,最後將結果作用於根處的操作符上來獲得整個表示式樹的值。下面展示乙個表示式的表示式樹形式,表示式為:(a+b×(c-d))-e/f。其表示式樹的形式為下圖所示。

可以對此表述式樹進行字首,中綴和字尾遍歷,所謂的前中後是針對操作符的輸出順序來說的,字首遍歷表示先輸出操作符再輸出左右子樹,中綴遍歷表示先輸出左子樹再輸出操作符最後輸出右子樹,字尾遍歷表示先輸出左右子樹最後輸出操作符。(在非表示式樹的二叉樹情況下,也有前中字尾遍歷,此時前中後可以理解為父節點的輸出順序。)此表示式樹進行前中字尾遍歷的結果分別為,

字首:-+a*b-cd/ef

中綴:a+b*c-d-e/f

字尾:abcd-*+ef/-

其中中綴表示式為算術表示式的通常表示,只是沒有括號。在計算機中字尾表示式是最方便計算的表示式形式。 

可以從字尾表示式構造出一棵表示式樹,演算法主要借助於棧資料結構,主要思路如下:順序讀入字尾表示式的字元,當讀入運算元時構造乙個新的節點,並且將指向新節點的指標存放到棧中。當讀入的字元為操作符時,利用操作符構造新的節點,並且從棧中彈出最上面的兩棵樹的指標,將操作符節點作為根,兩棵子樹作為根的子節點,先彈出的作為右兒子,後彈出的作為左兒子。形成新的樹並將指向樹的指標存入棧中,直到全部讀取完表示式。最後棧中只儲存乙個指向最終形成的表示式樹的指標。

資料結構 二叉樹 反轉二叉樹

include using namespace std define maxsize 1000 struct binary tree node class queue queue queue void queue push binary tree node btn binary tree node ...

《資料結構》 二叉樹

二叉樹 是 n個結點的有限集,它或為空集,或由乙個根結點及兩棵互不相交的 分別稱為該根的左子樹和右子樹的二叉樹組成。二叉樹不是樹的特殊情況,這是兩種不同的資料結構 它與無序樹和度為 2的有序樹不同。二叉樹的性質 1 二叉樹第 i層上的結點數最多為 2 i 1 2 深度為 k的二叉樹至多有 2 k 1...

資料結構 二叉樹

1.二叉樹 二叉樹是一種特殊結構的樹,每個節點中最多有兩個子節點,如圖1所示 圖1 二叉樹 在圖1中的二叉樹裡,a c有兩個子節點,b d有乙個子節點。對於二叉樹還有圖2中的以下情況 圖2 二叉樹的特殊情況 在博文中還介紹了滿二叉樹和完全二叉樹還有其他的特殊二叉樹。2.二叉樹的實現 有兩種實現方式,...