日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

php树形数据结构是什么,数据结构 之 树

發布時間:2024/7/23 php 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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树形数据结构是什么,数据结构 之 树的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。