樹的基本概念和二叉樹的遍歷

2021-09-14 02:14:39 字數 2027 閱讀 6840

樹和二叉樹的遍歷

一、樹的定義與儲存

1、樹的定義

在電腦科學中,樹是一種非線性結構,儲存的是具有「一對多」關係的資料元素的集合;(是不是像乙個家族關係表)

2、樹的基本術語

3、樹形結構

用鍊錶表示樹的結點

二、二叉樹的定義和性質

n個節點的有限集,每個節點至多有兩顆子樹,二叉樹的子樹有左右之分,不能任意顛倒。

二叉樹有五種基本形態:

特殊二叉樹:

性質:l 在二叉樹的第i層上至多有2i-1個結點(i>=1).

l深度為k的二叉樹至多有2k-1個結點

l對任意一顆二叉樹t,如果其終端結點為n0,度為2的結點數為n2,則n0=n2+1;

l具有n個結點的完全二叉樹的深度為[log2n]+1;

三、二叉樹的儲存結構

完全二叉樹可以用陣列表示(滿二叉樹是一種特殊的完全二叉樹)

用陣列存的特點:

(1)、非根節點i的父親結點的序號為[i/2];

(2)、結點i的左孩子序號為2*i;

(3)、結點i的右孩子序號為2*i+1;

二叉鍊錶:

四、二叉樹的遍歷

本質:按某種路徑訪問樹中的每個節點,使每個節點均被訪問一次,且僅被訪問一次;

二叉樹有三種常見遍歷:先序遍歷(有時候稱為前序遍歷)、中序遍歷、後序遍歷;

1、先序遍歷(根左右)

//二叉樹的先序遍歷

void pretree(btree t) 

}

2、

中序遍歷(左根右)

//二叉樹的中序遍歷

void intree(btree t) 

}

3、

後序遍歷(左右根)

//二叉樹的後序遍歷

void posttree(btree t) 

}

三種常見遍歷一定要記住,(其實也非常容易記,注意根的位置就行了)

4、非遞迴演算法(也就是迴圈,用到棧)(*)

//非遞迴遍歷

void stacktree(btree t) 

while (t || !s.empty())

else }}

5、層次遍歷(*)

按照從上到下、從左至右的循序訪問(用佇列實現)

//層次遍歷

void queuetree(btree t) 

}

五、樹和森林

簡單來講,森林就是樹的集合。

數、森林、二叉樹的轉換:

六、哈夫曼樹與哈夫曼編碼(*)

huffman樹(最優二叉樹):帶權路徑長度最小的樹

在這裡插入描述

哈夫曼樹的構造:

假設有n個權值,則構造出的哈夫曼樹有n個葉子結點。 n個權值分別設為 w1、w2、…、wn,則哈夫曼樹的構造規則為:

(1) 將w1、w2、…,wn看成是有n 棵樹的森林(每棵樹僅有乙個結點);

(2) 在森林中選出兩個根結點的權值最小的樹合併,作為一棵新樹的左、右子樹,且新樹的根結點權值為其左、右子樹根結點權值之和;

(3)從森林中刪除選取的兩棵樹,並將新樹加入森林;

(4)重複(2)、(3)步,直到森林中只剩一棵樹為止,該樹即為所求得的哈夫曼樹。

哈夫曼編碼:左分支0,右分支1(主要用於網路報文傳輸)

樹和二叉樹的基本概念

一 樹 1 樹型結構是一類非線性結構 2 樹是n n 0 個結點的有限集 3 樹有且僅有乙個根 root 結點,其餘互不相交的集合稱為根的子樹 4 有向樹有確定的根,且樹根和子樹之間為有向關係 我們一般討論有向樹 5 有序樹和無序樹的區別是子樹之間是否有次序關係 我們一般討論的是無序樹 6 樹的結點...

樹和二叉樹的基本概念

由乙個或多個 n 0 結點組成的有限集合t,有且僅有乙個結點稱為根 root 當n 1時,其餘的結點分為m m 0 個互不相交的有限集合t 1,t 2,t m。每個集合本身又是一顆樹,被稱為這個根的子樹。注1 過去許多書籍中都定義樹為n 1,曾經有 空樹不是樹 的說法,但現在樹的定義已修改。注2 樹...

樹 二叉樹的基本概念

樹基本概念 非線性結構,乙個直接前驅,但可能有多個直接後繼 1 n 樹的定義具有遞迴性,即樹中還有樹 根 葉子 森林 有序樹 無序樹 雙親 孩子 兄弟 堂兄弟 祖先 子孫 結點 結點的度 結點的層次 終端結點 分支結點 樹的度 所有結點度中的最大值 max 樹的深度指所有結點中最大的層數 max 或...