php树形数据结构是什么,数据结构 之 树
概述
樹的章節一般分兩大部分: 一部分將樹,一部分將二叉樹;雖然二叉樹也是樹,但是二叉樹足夠特殊,足夠有用,所以重點來講;或者說,如果不是二叉樹,樹的家族也不會如此的德高望重。
在二叉樹中,又有一些特殊性質的二叉樹,可能沒法用樹的結構來描述他們之間的關系;比如: 滿二叉樹一定是完全二叉樹;完全二叉樹和二叉排序樹直接卻沒有從屬關系;完全二叉樹和二叉排序樹是從不同的維度定義出來的特殊的二叉樹。
二叉排序樹(也叫二叉查找樹)在樹的家族中是一顆耀眼的明星,但是在樹的章節中沒有被介紹,大概因為這是二叉樹的實際應用,而和樹本身的形態沒有直接關系;還有一些特殊的樹,如:紅黑樹、B+、B-樹,稍后再研究,有些數據結構的書是沒有提及的,大概因為這些東西可以自學,不需要教吧。
樹
樹的邏輯結構
樹的定義
樹是n(n>=0)個結點的有限集合。當 n= 0 時,稱為空樹;任意一顆非空樹滿足一下兩個條件:
有且只有一個特定的稱為根的結點
當 n > 1 時,除根結點之外的其余結點被分成m(m>0)個互不相交的有限集合T1, T2, …, Tm,其中每個集合又是一棵樹,并稱為這個根結點的子樹
樹的基本術語
結點的度,樹的度
葉子結點,分支結點
孩子結點,雙親結點,兄弟結點
路徑、路徑長度
祖先、子孫
結點的層數、樹的深度(高度)
層序編號
有序樹、無序樹
森林
同構
樹的表示形式
一般有四種表示形式:
樹形圖
嵌套圖
凹凸表
廣義表
樹的遍歷
前(根)序遍歷
后(根)序遍歷
層序遍歷
注: 這里說的是樹,不是二叉樹,所以沒有中序遍歷(如果有的話,三個子樹的樹根應該放哪里?)
樹的存儲結構
雙親表示法
思想: 每個結點都記住自己雙親結點的位置(即可保證該樹是唯一的)
缺點: 要找到一個結點的所有孩子是比較麻煩的
使用數組存儲還是比較方便的
孩子表示法
思想: 每個結點都記住自己孩子的位置(即可保證該樹是唯一的)
缺點: 要找到結點的雙親結點比較麻煩
兩種形式:
多重鏈表標識
思想: 父親那N個繩拉住自己的N個孩子
關于拿幾根繩?兩種辦法:
有幾個孩子拿幾根繩
需要有一個地方記錄自己的繩子數目(就是該結點的度)
孩子最多的父親拿幾根繩子大家就都拿幾根繩子
沒人的繩子數目是一樣的,不需要各自記錄
孩子鏈表
思想:所有節點維護在一個數組中;然后,父親拿一根繩子牽著老大,然后老大牽著老二;依次類推
孩子雙親表示法
思想:孩子表示法中,添加一個雙親節點的指針
孩子兄弟表示法
思想: 每個節點都左手拉著自己孩子,右手拉著自己的弟弟妹妹
二叉樹
概述
二叉樹是一種最簡單的樹結構,其存儲結構更具有規范性和確定性,在一系列條件的約束下,使得二叉樹具有很多的性質,方便我們研究和使用二叉樹。
二叉樹的定義
二叉樹的5種基本形態
空二叉樹
只有一個根結點
根結點只有左子樹
根結點只有右子樹
根結點既有左子樹又有右子樹
特殊二叉樹
斜樹
左斜樹
右斜樹
滿二叉樹
完全二叉樹
從滿二叉樹的最后面的結點去掉n (n >= 0)個結點都是完全二叉樹
滿二叉樹是一種特殊的完全二叉樹
二叉樹的性質
二叉樹有5個重要的性質,他們主要討論了樹的深度、結點數等之間的關系
在二叉樹的第i層上至多有2i-1個結點 (i >= 1)
深度為k的二叉樹至多有2k-1個結點 (k >=1)
對任何一顆二叉樹T,如果其葉子結點數為n0,度為2的結點數為n2,則:n0=n2+1
具有n個結點的完全二叉樹的深度為log2n+1
如果有一顆有n個節點的完全二叉樹的節點按層次序編號,對任一層的節點i(1<=i<=n)有1.如果i=1,則節點是二叉樹的根,無雙親,如果i>1,則其雙親節點為[i/2],向下取整
2.如果2i>n那么節點i沒有左孩子,否則其左孩子為2i
3.如果2i+1>n那么節點沒有右孩子,否則右孩子為2i+1
二叉樹的遍歷
前序遍歷
中序遍歷
后序遍歷
二叉樹的存儲
順序表
思想: 將一棵樹通過添加“虛節點”的方式完善成完全二叉樹,然后存儲
缺點: 空間浪費嚴重,只適合存儲完全二叉樹的情況
鏈式存儲
二叉鏈表
思想: 每個結點包含數據域和左右孩子兩個指針域
缺點: 尋找雙親結點不方便
三叉鏈表
思想: 在二叉鏈表的基礎上添加雙親結點指針域
線索鏈表
實際問題: select * from tb where id < N limit 2; 在這種情況下,我們不僅要查到id=2的結點,還要找到他附近的一些結點;即: 需要訪問二叉樹中的結點在某種遍歷序列中的前驅和后繼;
于是: 在存儲結構中應該保存結點在某種遍歷序列中前驅和后繼的信息。
思想: 根據二叉樹的性質可知,二叉樹中有n+1個指針域為空,可以想辦法利用起來;通過添加標記來區分是孩子指針還是前驅(或后繼)指針;注意: 挨著自己的孩子在線索化中未必就挨著自己,但是要找到挨著自己的那個結點并不難,對于中序線索鏈表,如果自己子樹的深度為k,則,找到自己的前驅或后繼的時間復雜度為log2k
由于二叉樹的遍歷次序有三種,因此有三種意義上的前驅和后繼,相應的也有三種線索鏈表:前序線索鏈表、中序線索鏈表、后序線索鏈表。中序線索鏈表看起來更加直觀一些
中序線索鏈表上求結點前驅
中序線索鏈表上求結點后繼
中序線索鏈表上遍歷
總結
以上是生活随笔為你收集整理的php树形数据结构是什么,数据结构 之 树的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html彩色背景指令,HTML_第四章
- 下一篇: codesoft指定打印机打印_巧用wi