一種非線性結構。
樹是遞迴結構,在樹的定義中又用到了樹的概念。
樹結點:包含乙個資料元素及若干指向子樹的分支;
孩子結點:結點的子樹的根稱為該結點的孩子;
雙親結點:b結點是a結點的孩子,則a結點是b結點的雙親;
兄弟結點:同一雙親的孩子結點;
堂兄結點:同一層上結點;
結點層次:根結點的層定義為1;根的孩子為第二層結點,依此類推;
樹的高(深)度:樹中最大的結點層
結點的度:結點子樹的個數
樹的度: 樹中最大的結點度。
葉子結點:也叫終端結點,是度為0的結點;
分枝結點:度不為0的結點(非終端結點);
森林:互不相交的樹集合;
有序樹:子樹有序的樹,如:家族樹;
無序樹:不考慮子樹的順序;
二叉樹二叉樹可以為空。
二叉樹結點的子樹要區分左子樹和右子樹,即使只有一棵子樹也要進行區分,說明它是左子樹,還是右子樹。這是二叉樹與樹的最主要的差別。
**注意區分:**二叉樹、二叉查詢樹/二叉排序樹/二叉搜尋樹、二叉平衡(查詢)樹二叉平衡樹肯定是一顆二叉排序樹。堆不是一顆二叉平衡樹。二叉樹與樹是不同的,二叉樹不等價於分支樹最多為二的有序樹。當乙個結點只包含乙個子節點時,對於有序樹並無左右孩子之分,而對於二叉樹來說依然有左右孩子之分,所以二叉樹與樹是兩種不同的結構。
一、性質:
在二叉樹的第 i 層上至多有2i-1個結點。
深度為 k 的二叉樹上至多含 2k-1 個結點(k≥1) 對任何一棵二叉樹,若它含有n0個葉子結點、n2個度為 2 的結點,則必存在關係式:n0= n2+1。
具有 n 個結點的完全二叉樹的深度為⎣log2 n⎦+1 。
n個結點的二叉樹中,完全二叉樹具有最小的路徑長度。
如果對一棵有n個結點的完全二叉樹的結點按層序編號,則對任一結點i(1<=i<=n),有: 如果i=1,則結點i無雙親,是二叉樹的根;如果i>1,則其雙親的編號是 i/2(整除)。
如果2i>n,無左孩子;否則,其左孩子是結點2i。
如果2i+1>n,則結點i無右孩子;否則,其右孩子是結點2i+1。
二叉樹的儲存結構順序儲存結構:僅僅適用於滿或完全二叉樹,結點之間的層次關係由性質5確定。
二叉鍊錶法:每個節點儲存左子樹和右子樹。三叉鍊錶:左子樹、右子樹、父節點,總的指標是n+2 在有n個結點的二叉鍊錶中,值為非空的鏈域的個數為n-1。在有n個結點的二叉鍊錶中必定有2n個鏈域。除根結點外,其餘n-1個結點都有乙個父結點。所以,一共有n-1個非空鏈域,其餘2n-(n-1)=n+1個為空鏈域。
二叉鏈儲存法也叫孩子兄弟法,左指標指向左孩子,右指標指向右兄弟。而中序遍歷的順序是左孩子,根,右孩子。這種遍歷順序與儲存結構不同,因此需要堆疊儲存中間結果。而中序遍歷檢索二叉樹時,由於其儲存結構跟遍歷順序相符,因此不需要用堆疊。遍歷二叉樹和線索二叉樹遍歷二叉樹:使得每乙個結點均被訪問一次,而且僅被訪問一次。
二、非遞迴的遍歷實現要利用棧。
前序遍歷dlr:根節點->左子樹->右子樹
中序遍歷ldr:左子樹->根節點->右子樹。必須要有中序遍歷才能得到一棵二叉樹的正確順序
後序遍歷lrd:左子樹->右子樹->根節點。需要棧的支援。
層次遍歷:用一維陣列儲存二叉樹時,總是以層次遍歷的順序儲存結點。層次遍歷應該借助佇列。
線索二叉樹:對二叉樹所有結點做某種處理可在遍歷過程中實現;檢索(查詢)二叉樹某個結點,可通過遍歷實現;如果能將二叉樹線索化,就可以簡化遍歷演算法,提高遍歷速度,目的是加快查詢結點的前驅或後繼的速度。
如何線索化?以中序遍歷為例,若能將中序序列中每個結點前趨、後繼資訊儲存起來,以後再遍歷二叉樹時就可以根據所儲存的結點前趨、後繼資訊對二叉樹進行遍歷。對於二叉樹的線索化,實質上就是遍歷一次二叉樹,只是在遍歷的過程中,檢查當前結點左,右指標域是否為空,若為空,將它們改為指向前驅結點或後繼結點的線索。
前驅就是在這一點之前走過的點,不是下一將要去往的點。加上結點前趨後繼資訊(結索)的二叉樹稱為線索二叉樹。n個結點的線索二叉樹上每個結點有2個指標域(指向左孩子和右孩子),總共有2n個指標域;乙個n個結點的樹有n-1條邊,那麼空指標域= 2n - (n-1) = n + 1,即線索數為n+1。指標域tag為0,存放孩子指標,為1,存放前驅/後繼節點指標。線索樹下結點x的前驅與後繼查詢:設結點x相應的左(右)標誌是線索標誌,則lchild(rchild)就是前驅(後繼),否則:ldr–前驅:左子樹中最靠右邊的結點;後繼:右子樹中最靠左邊的結點 lrd–前驅:右子樹的根,若無右子樹,為左子樹跟。後繼:x是根,後繼是空;x是雙親的右孩子、x是雙親的左孩子,但雙親無右孩子,雙親是後繼;x是雙親的左孩子,雙親有右孩子,雙親右子樹中最左的葉子是後繼 dlr–對稱於lrd線索樹—將lrd中所有左右互換,前驅與後繼互換,得到dlr的方法。
為簡化線索鍊錶的遍歷演算法,仿照線性鍊錶,為線索鍊錶加上一頭結點,約定: 頭結點的lchild域:存放線索鍊錶的根結點指標;
頭結點的rchild域: 中序序列最後乙個結點的指標;
中序序列第一結點lchild域指向頭結點;
中序序列最後乙個結點的rchild域指向頭結點; 中序遍歷的線索二叉樹以及線索二叉樹煉表示意圖一棵左右子樹均不空的二叉樹在前序線索化後,其中空的鏈域的個數是1。
前序和後續線索化後空鏈域個數都是1,中序是2。
抹線:對每個結點,除了其左孩子外,去除其與其餘孩子之間的關係 旋**以樹的根結點為軸心,將整樹順時針轉45°森林轉換成二叉樹:將各棵樹分別轉換成二叉樹 將每棵樹的根結點用線相連 以第一棵樹根結點為二叉樹的根樹與轉換後的二叉樹的關係:轉換後的二叉樹的先序對應樹的先序遍歷;轉換後的二叉樹的中序對應樹的後序遍歷哈弗曼樹/霍夫曼樹一些概念路徑:從乙個祖先結點到子孫結點之間的分支構成這兩個結點間的路徑; 路徑長度:路徑上的分支數目稱為路徑長度; 樹的路徑長度:從根到每個結點的路徑長度之和。
結點的權:根據應用的需要可以給樹的結點賦權值; 結點的帶權路徑長度:從根到該結點的路徑長度與該結點權的乘積; 樹的帶權路徑長度=樹中所有葉子結點的帶權路徑之和;通常記作 wpl=∑wi×li 哈夫曼樹:假設有n個權值(w1, w2, … , wn),構造有n個葉子結點的二叉樹,每個葉子結點有乙個 wi作為它的權值。則帶權路徑長度最小的二叉樹稱為哈夫曼樹。最優二叉樹。
字首碼的定義:在乙個字符集中,任何乙個字元的編碼都不是另乙個字元編碼的字首。霍夫曼編碼就是字首碼,可用於快速判斷霍夫曼編碼是否正確。
三、霍夫曼樹是滿二叉樹。
若有n個節點,則共有(n+1)/2個碼子給定n個權值作為n的葉子結點,構造一棵二叉樹,若帶權路徑長度達到最小,稱這樣的二叉樹為最優二叉樹,也稱為霍夫曼樹(huffman tree)。霍夫曼樹是帶權路徑長度最短的樹,權值較大的結點離根較近。假設哈夫曼樹是二叉的話,則度為0的結點個數為n,度為2的結點個數為n-1,則結點總數為2n-1。哈夫曼樹的結點個數必為奇數。哈夫曼樹不一定是完全二叉樹,但一定是最優二叉樹。若度為m的哈夫曼樹中,其葉結點個數為n,則非葉結點的個數為[(n-1)/(m-1)]。邊的數目等於度。圖遍歷與回溯圖搜尋->形成搜尋樹窮舉法。
貪心法。多步決策,每步選擇使得構成乙個問題的可能解,同時滿足目標函式。
回溯法。根據題意,選取度量標準,然後將可能的選擇方法按度量標準所要求順序排好,每次處理乙個量,得到該意義下的最優解的分解處理。圖無向圖迴路或環:第乙個頂點和最後乙個頂點相同的路徑。
簡單迴路或簡單環:除第乙個頂點和最後乙個頂點之外,其餘頂點不重複出現的迴路 連通:頂點v至v』 之間有路徑存在 連通圖:無向圖圖 g 的任意兩點之間都是連通的,則稱g是連通圖。
連通分量:極大連通子圖,子圖中包含的頂點個數極大 所有頂點度的和必須為偶數有向圖:迴路或環:第乙個頂點和最後乙個頂點相同的路徑。
簡單迴路或簡單環:除第乙個頂點和最後乙個頂點之外,其餘頂點不重複出現的迴路。
連通:頂點v至v』之間有路徑存在 強連通圖:有向圖g的任意兩點之間都是連通的,則稱g是強連通圖。各個頂點間均可達。
強連通分量:極大連通子圖
有向圖頂點的度是頂點的入度與出度之和。鄰接矩陣中第v行中的1的個數是v的出度
生成樹:極小連通子圖。包含圖的所有n個結點,但只含圖的n-1條邊。在生成樹中新增一條邊之後,必定會形成迴路或環。
完全圖:有 n(n-1)/2 條邊的無向圖。其中n是結點個數。必定是連通圖。
有向完全圖:有n(n-1)條邊的有向圖。其中n是結點個數。每兩個頂點之間都有兩條方向相反的邊連線的圖。
乙個無向圖 g=(v,e) 是連通的,那麼邊的數目大於等於頂點的數目減一:|e|>=|v|-1,而反之不成立。如果 g=(v,e) 是有向圖,那麼它是強連通圖的必要條件是邊的數目大於等於頂點的數目:|e|>=|v|,而反之不成立。沒有迴路的無向圖是連通的當且僅當它是樹,即等價於:|e|=|v|-1。
圖的儲存形式鄰接矩陣和加權鄰接矩陣 無權有向圖:出度: i行之和;入度: j列之和。
無權無向圖:i結點的度: i行或i列之和。
加權鄰接矩陣:相連為w,不相連為∞
鄰接表 用頂點陣列表、邊(弧)表表示該有向圖或無向圖
頂點陣列表:用陣列存放所有的頂點。陣列大小為圖頂點數n
邊表(邊結點表):每條邊用乙個結點進行表示。同乙個結點的所有的邊形成它的邊結點單鏈表。
n個頂點的無向圖的鄰接表最多有n(n-1)個邊表結點。有n個頂點的無向圖最多有n*(n-1)/2條邊,此時為完全無向圖,而在鄰接表中每條邊儲存兩次,所以有n*(n-1)個結點
四、圖的遍歷.
深度優先搜尋利用棧,廣度優先搜尋利用佇列求一條從頂點i到頂點s的簡單路徑–深搜。求兩個頂點之間的一條長度最短的路徑–廣搜。當各邊上的權值均相等時,bfs演算法可用來解決單源最短路徑問題。
生成樹和最小生成樹
每次遍歷乙個連通圖將圖的邊分成遍歷所經過的邊和沒有經過的邊兩部分,將遍歷經過的邊同圖的頂點構成乙個子圖,該子圖稱為生成樹。因此有dfs生成樹和bfs生成樹。
生成樹是連通圖的極小子圖,有n個頂點的連通圖的生成樹必定有n-1條邊,在生成樹中任意增加一條邊,必定產生迴路。若砍去它的一條邊,就會把生成樹變成非連通子圖。
最小生成樹:生成樹中邊的權值(代價)之和最小的樹。最小生成樹問題是構造連通網的最小代價生成樹。
二叉樹 滿二叉樹和完全二叉樹
二叉樹是一種很重要的非線性資料結構,它是樹結構的一種重要的型別 它不是樹結構的特殊情況 其特徵是每個節點最多有兩個子樹。二叉樹的特點 二叉樹每個結點最多有 2個子結點,樹則無此限制 二叉樹中 結點的子樹 分成左子樹和右子樹,即使某結點只有一棵子樹,也要指明該子樹是左子樹,還是右子樹,就是說 二叉樹是...
樹 二叉樹 滿二叉樹 完全二叉樹 完滿二叉樹
目錄名稱作用根 樹的頂端結點 孩子當遠離根 root 的時候,直接連線到另外乙個結點的結點被稱之為孩子 child 雙親相應地,另外乙個結點稱為孩子 child 的雙親 parent 兄弟具有同乙個雙親 parent 的孩子 child 之間互稱為兄弟 sibling 祖先結點的祖先 ancesto...
二叉樹和完全二叉樹
二叉樹規律 假設根節點的高度為0 二叉樹是每個節點至多只有兩個節點的樹 深度為i所在的層至多有 2 i個節點 高度為k的二叉樹至多有2 k 1 1個節點 n0表示度為0的節點,n2表示度為2的節點,存在n0 n2 1 對所有樹有 節點個數 邊數 1 完全二叉樹規律 節點數為n的完全二叉樹,其高度為 ...