樹和二叉樹的遍歷
一、樹的定義與儲存
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 或...