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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

树和二叉树的基本概念(二级)

發(fā)布時間:2024/4/13 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 树和二叉树的基本概念(二级) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

我們來看數(shù)據(jù)結(jié)構(gòu)的另外一塊內(nèi)容,樹和二叉樹,這是我們數(shù)據(jù)結(jié)構(gòu)的一個重點,尤其是二叉樹來說,樹是一個重點,我們主要是研究二叉樹,先看一下樹的基本概念,然后我們再看一下二叉樹的基本知識,這兩部分講完之后呢,就來將二叉樹的實現(xiàn),主要是來講二叉樹的遍歷,有先序,中序,后序遍歷,我們這個遍歷不僅要給出一個二叉樹,寫出你的遍歷結(jié)果把各個節(jié)點寫出來,還要通過代碼把它實現(xiàn),在這里面我們是大量的使用了遞歸的,包括在我們后續(xù)的圖里面,甚至查找排序里面,遞歸是得到大量的使用的,我們先看樹的基本概念什么叫樹?生活中的樹是什么,是族譜,上下級關系,倒掛著數(shù),然后是一對多的關系,一個公司的組織架構(gòu),包括一個盤的目錄結(jié)構(gòu),這都是樹狀結(jié)構(gòu),我們要是把他化成邏輯結(jié)構(gòu)呢,這么來畫就可以了,他表示的是一種上下級的關系,這個都帶箭頭的,這個大家明確一下,樹是tree,樹最少有幾個節(jié)點,樹最少0個節(jié)點,0個節(jié)點就是一個空樹,一個節(jié)點只有一個根,A上面什么也沒有,一個節(jié)點也沒有,這也是一種樹,n大于等于0,或者是一顆空樹,n等于0,不包括任何節(jié)點,或者是一個非空樹,但是至少有一個節(jié)點,既是最上層的也是最底層的,或者是分成很多層次的,這樣一種一對多的關系什么叫做節(jié)點的度和樹的度?度用英文單詞表示就是Degree,通俗的來說,節(jié)點的度就是這個節(jié)點往下分了幾個叉,他又幾個子樹,比如說,A的度是幾,是3,為什么是3,因為有3個子樹,或者說有3個叉,然后這個K的度是幾,是0,H是1,這里面有沒有度為2的節(jié)點,B和E,這是節(jié)點的度,整個樹的度是多少,就是最大節(jié)點的那個度唄,這個度有0的,有1的,有2,也有3的,節(jié)點的最大節(jié)點是3,樹的度就是最大節(jié)點的最大值,這沒有任何難度吧,如果一個度它的節(jié)點是0,那說明什么,K,L,M,I,J這些節(jié)點度是0,說明他們是生活在最底層的,如果對應我們的一個文件目錄的話,表明它是一個文件,它不是個文件夾,我們?nèi)€名字叫葉子節(jié)點度為0的節(jié)點我們稱之為葉子節(jié)點,或者叫終端節(jié)點,度不是0的呢,就叫非終端節(jié)點,比如看這個圖里面,我們用兩種顏色標記了,哪兩種顏色,綠色的叫終端節(jié)點,也是葉子節(jié)點,然后藍色的,非終端節(jié)點,還有一個特別的標記了一下,這個叫根節(jié)點非終端節(jié)點,除了根以外的分支節(jié)點,稱之為內(nèi)部節(jié)點,根不算內(nèi)部的,根算外部的,除了根之外的終端節(jié)點,我們可以起個名字叫內(nèi)部節(jié)點,根據(jù)這個圖我們就把這個概念理解了. 節(jié)點的層次和樹的深度?節(jié)點是第幾層,根有第幾層,整個樹有幾層,總共有4層,根算第一層,這個要明確一下,我們要建立我們共同語言才可以,他的孩子就是第二層,孩子的孩子就是第三層,再往下就是第四層,E他的層次是3,C是2,根永遠是1,葉子的層次會是幾,葉子的層次就不確定,這幾個葉子是4,這兩個葉子就是3,那不確定,樹的深度是什么,就是樹一共有多少層唄,一共有幾層啊,或者樹的最大層次數(shù),稱為樹的深度,或者叫高度,在往下看,父親,兒子,兄弟?什么叫父親兒子兄弟,A和B相比,A和B是什么關系,A是父親,B是兒子,B有沒有兄弟,有,C和D,請問E有沒有兄弟,有誰啊,有F,這G,H算是他的兄弟嗎,不是親兄弟,是不是堂兄弟,我們這個父親,兒子是指親兒子的,兄弟也是指親兄的,父子關系,兄弟關系祖先,子孫,堂兄弟?比如我要問,對于這個E來說,他的祖先是誰,那對于K來說祖先是誰,是A,B叫他的祖先嗎,不是這么來說的,最終我們建立這種關系,K的祖先是誰,EBA,往上的都是他的祖先,不是光最頂級的那個,什么叫祖先,以K為例,往上到第三層,到第二層,順著這條線往上走,都是他的祖先,什么叫子孫呢,比如B,B的子孫有誰,EF是他的兒子,KL都是他的子孫,這里面有一個節(jié)點叫A,高高在上,下面所有的這些都是他的子孫,什么叫堂兄弟,E他的堂兄弟有誰,有GHIJ,這些都相當于他的堂兄弟,F相當于是他的親兄弟,K的堂兄弟是M,這個關系就遠一點了,K的父親和F的父親也不是親兄弟,E的父親和H的父親這是親兄弟了,層次越多這個關系就會稀疏一些,堂兄弟只要是在一個層次的,我們認為都是堂兄弟,建立這種關系,建立這種概念,再往下什么叫有序數(shù)? M叉樹? 森林?有序數(shù)是什么意思啊,你覺得是一棵樹還是兩顆樹,是不是都有B,是不是還有一棵樹叫F,有什么區(qū)別,順序是不是變了一下,是一棵樹還是兩棵樹,如果你說這是兩棵樹,那就是左右是區(qū)分的了,那叫有序數(shù),如果你說這是一棵樹,不區(qū)分左右,那就是無序的了,明確一下,如果不考慮子樹的順序,就稱為無序樹,考慮的話就是有序樹,明確一下,如果不做特別的指明,我們討論的一般都是有序樹,什么叫M叉樹,就是最多有幾個叉,比如說這個算幾叉樹,這個算2叉樹,B有兩個叉,E分兩個叉,二叉樹,再找個例子來說,這個是幾叉樹,這個是3叉樹,最多是三個叉,還有嗎,這個是幾叉樹我們就不數(shù)了,這個叉就多了去了,幾叉樹明確了,什么叫森林,一般森林和樹是什么關系,就是一堆樹唄,一堆樹就是森林,就是這個樣子的,但是最少的森林有幾棵樹,森林是m和互不相交樹的集合,注意啊必須是互不相交的,你看這是一棵樹,這是一顆,這是另外一顆,是不是沒有關系沒有關系,這是個二叉樹,這是個一叉樹,這是個三叉樹,互不相交的樹,m大于等于0,一顆兩顆三顆,0顆可以,他這森林就是空的唄樹可以是空的,森林也可以是空的,森林就是m大于等于0顆互不相交樹的集合,如果我們對這三顆樹再加一個共同的父類,共同的父節(jié)點,他又變成一棵樹了,這是一棵樹,如果我們把D去掉,D去了,把這個根去了,他又變成一個森林了,這是我們說的樹的一些概念,比較簡單,二叉樹就會稍微繁瑣一下,我們在后續(xù)的課程中主要是研究二叉樹,你如果不做限制條件的話,研究任何形式的樹不好研究,因為它到底分多少叉呢,這個不確定 二叉樹:什么叫二叉樹,簡單來說就是分2個叉唄,仔細一看這是不是二叉樹,是的,二叉樹怎么來定義,可以遞歸定義的,什么叫二叉樹,嚴格來說,腦子里面怎么來想的,為什么你說他是個二叉樹,我們給出嚴謹?shù)亩x,這是一個根,他又幾個子樹,;兩個子樹,二叉樹都是有序的,這么一來你會發(fā)現(xiàn)他有一個左子樹,還有一個右子樹,最多分兩個叉,然后對他的左子樹來說怎么辦,對于他的左子樹來說,我們同樣可以,這是一個根,左子樹沒有,右子樹在這兒,最多分兩個叉唄,同樣遞歸定義,對于他的右子樹來說怎么了這是一個根,這是一個左子樹,這是一個右子樹,結(jié)束了吧,沒有,對于這個節(jié)點來說,它是根,他有左子樹嗎,沒有,他有右子樹嗎,沒有,最多分兩個叉,是不是可以一個叉也沒有,這就是我們遞歸的定義,總體上是二叉樹,局部也是二叉樹,每一部分都是二叉樹,可以是一個空樹,我先問大家一下,如果我們有這么一塊內(nèi)容,這是不是一個二叉樹,這兩個節(jié)點是二叉樹,他也是二叉樹,最多分兩個叉,人家分一個叉,我只有一個根,也可以是一個二叉樹,這是不是也是二叉樹,我來個空的,也可以是二叉樹,這個概念大家可以搞明白了,每個孩子有左右之分,左子樹和右子樹,這是我們二叉樹的5種基本狀態(tài)畫橫線的表示一個節(jié)點也沒有,b呢只有根節(jié)點,C只有左子樹,e只有右子樹,這是兩顆不同的樹,c和e是兩顆不同的樹因為他是有序的,d既有左子樹又有右子樹什么叫滿二叉樹?每一層都是最多的節(jié)點,那你想第一層最多是幾個節(jié)點,第一層是根節(jié)點,是不是有一個,第二層兩個,第三層4個,下一層8個,左邊是不是滿足這個條件,每一層都是滿的,滿二叉樹,高度為k的樹最多有幾個節(jié)點,每層都達到最滿的,就是二叉樹,什么叫完全二叉樹?這是一個完全二叉樹,什么算是完全的,一共是4層,第一層是滿的,第二層也是滿的,第三層也是滿的,不滿的只是最下面一層,并且他這個不滿是怎么個不滿呢,從右邊開始不滿的,如果我要是把11去了,有12,他是不是完全的,不是完全的,他必須有這個11,有10,有12,中間沒有11,那就是不完全的,最下層從最右側(cè)起,去掉若干個葉子節(jié)點,得到的是完全二叉樹,比如這是一個完全的從右邊開始去,得到的一直是完全二叉樹,是不是又變成一顆滿二叉樹了,滿二叉樹肯定是完全二叉樹,完全二叉樹不見得是滿的滿的是完全的一種特殊情況吧,這是我們所說的一種概念,概念大家必須要知道的,什么叫滿二叉樹,什么叫完全二叉樹,這樣的一些概念,再往下 二叉樹他有一些性質(zhì)的?有什么性質(zhì)呢,總共有6個性質(zhì),我們就不一一說明了,比如說你會發(fā)現(xiàn)這里是有特點的,比如給大家舉個例子,大家仔細的數(shù),左邊這個例子里面,葉子節(jié)點有幾個,左邊的葉子節(jié)點,8個,然后度是2的節(jié)點,分兩個叉的,7個,好像正好差一個,我們數(shù)一下葉子節(jié)點有幾個,3個,度是2的節(jié)點,2個,是不是還差一個,這是不是一個規(guī)律,這是一個規(guī)律,二叉樹里面是有這個性質(zhì)的,什么性質(zhì),對于任意一個二叉樹,其終端節(jié)點是n0,度為2的節(jié)點是n2,n0=n2+1,他們正好是差一個,你要是去網(wǎng)上查一些復雜的資料他對這些性質(zhì)會有數(shù)學證明的,說明他是非常嚴謹?shù)?還有一個每一層最多有多少個節(jié)點,第一層有1個,第二層有2個,第三層有4個,第四層有八個,請問第i層有幾個,2的i減1次方,那這個對不對呢,二叉樹的i層上最多有2的i減1次個節(jié)點,但是有些性質(zhì)他是這么來寫的有些是把根當做第0層的,這個明確一下,我特別標記了,根是第一層,還有其他的一些性質(zhì),這是我們講的二叉樹的6個性質(zhì),大家下去看一下下面我們來講一下二叉樹的存儲結(jié)構(gòu)同樣我們線性表怎么來存的,線性表順序存儲結(jié)構(gòu),鏈式存儲結(jié)構(gòu),我們的棧和隊列怎么來存的,順序結(jié)構(gòu)和鏈式存儲結(jié)構(gòu),到樹這一樣,到樹這里還是這個樣子,因為我們采用數(shù)組來存,第二個我們采用鏈式存儲結(jié)構(gòu)來存,實際開發(fā)中哪一種用的多,鏈式存儲結(jié)構(gòu),為什么順序存儲結(jié)構(gòu)用的不多呢,我們來看一下,如果他是一個完全二叉樹的話,每一層都是滿的,除了最后一層,這么一來我們可以這么來存,這么來存就怎么了,我們來標記一下,這是個完全二叉樹,我們存了1,2一直存下去,并且你可以發(fā)現(xiàn)每一層都沒有落下,存在二叉樹里面一個空間一個,空間沒有浪費,第二個也不需要存地址,這里面并且還隱藏著父子關系,我就知道4的父親是誰,4的父親是誰,4的兒子是誰,我都可以知道,為什么知道啊,因為它每次必須分兩個叉,按照索引來說,隨便哪一個索引是6個元素,你不要看上面的圖,值是不是7,7的父親是3,7除以2,整除的話是3,然后9除以2,4.5取整就是4,4的孩子乘以2,是8,9,他們之間是有父子關系的,他的索引是從0開始算,從0開始算和從1開始算是有差別的,在二叉樹里面,二叉樹里面是有這個規(guī)律的,對一顆有n個節(jié)點的完全二叉樹,進行編號,節(jié)點從1開始,如果從1開始,他的雙親是誰,孩子是誰,有沒有左孩子但是順序存儲結(jié)構(gòu)我們用的不多呢?因為我們處理的樹不是完全的,有人說這個我會存,這個不是太簡單了嗎,這是不是1,3,7,我這里不是存?zhèn)€1,3,7不就行了嗎,你要這么存的話就要對應哪個樹,他應該對應這個棵樹,是這么來的,我們還得靠性質(zhì)6,根據(jù)索引找到雙親和孩子的,你要這么來搞按照公式來說,那只能表示這棵樹,對于這種二叉樹來說,我們用順序結(jié)構(gòu)來表示,沒有節(jié)點的話寫一個,這兒還有一個,這兒還有一個,這兒還落著一個,沒有值就空著,3寫到這,123沒有就空著的,7位寫到這,有人說我為什么要這么存這樣存就可以找到他的孩子和他的雙親,但是這么做好不好,不好,為什么不好,大量的浪費,為了維持這種父子關系,導致了空間的浪費,這個大家了解就可以了,那實際開發(fā)中用的最多的還是鏈式存儲結(jié)構(gòu) 鏈式存儲結(jié)構(gòu):我們在這里給大家畫一棵樹,順序表怎么用數(shù)組來表示已經(jīng)說了,但是=這棵樹用順序表來表示不太合理,會導致一些浪費,既然會導致浪費就使用鏈表來存儲唄,同樣,這是有很多的節(jié)點來組成,那你想這個節(jié)點有幾部分組成,畫上一個節(jié)點,表明代表這個根節(jié)點,最少也應該包括3部分,首先要存放這個數(shù)據(jù)E,起個名字叫data,他就代表數(shù)據(jù),left是左子樹,right右子樹,當然這是兩個引用,或者叫指針,是不是和我們的鏈表里面一樣的,如果這是一個Node話,他還是指向Node的,下邊該怎么畫,E有了,A往這里畫,仔細的畫畫一遍就搞懂了,看樣子我們還得多畫幾個,告訴我該怎么辦,這個地址0X2012,0X5012,這個0X6012,這個0X9999,就像告訴大家這個地址沒有規(guī)律,0X8888,就是他,告訴我這個地址多少,這個0X1012,先寫數(shù)吧,A,這個G,這個C,這個B,這個D,F,都有了,我這里寫什么0X2012,這里0X5012,是不是就指向這一塊了,這應該怎么畫,這里是空的,沒有,我們直接連就可以了,這個位置指向這兒的,C是0X9999,對于葉子節(jié)點來說,沒有左孩子也沒有右孩子,或者說沒有左子樹也沒有右子樹,有時候我發(fā)現(xiàn)呢,寫這么一個符號^,也就代表null的,用它來表示就可以了,如果你這顆樹不規(guī)則的話,我們是不是可以采用這種方式來存儲,但是這個存儲有一個特點,有一個什么特點,就像我們的鏈表一樣,它是從上到下指向的,我找到這個E吧,左海子就通過這個地址找到他了,根據(jù)這個地址就可以找到他了,可以往下走,根據(jù)父親找兒子,是沒有任何問題的,我想找到D的父親是誰,我想找到C的父親是誰,比如C的父親是誰,是不是要從頭找,就像我們的鏈表一樣,但是鏈表只能向后找,不能向前找,雙向鏈表是不是可以都找,這個也差不多,現(xiàn)在是只能從父親找兒子,只能從祖先找后代,但是我有了一個后代,想知道他的上級,他的父親是誰,他的祖先是誰,你知道嗎,不知道,如果你想提高效率,就要拿著空間換時間,多分一點空間存儲一些有用的數(shù)據(jù),然后呢,我們查找的時候就簡單了,怎么來辦,這么來辦就可以了二叉鏈表:只能找孩子,怎么就成了三叉了,我們特別標記一下,再補一個,就補了一塊,補完了一塊怎么辦,每個節(jié)點再增加一個域,存放他父親的地址,0X6012,這么一來怎么辦,是不是就這樣指向了,然后我們再來看,0X2012,這種引用關系就存在了,0X1012,怎么辦,指向根了,他的父親是null,它是從石頭里面出來的,你看增加這空間有什么好處,可以順藤摸瓜找他的后代現(xiàn)在我們隨便找一個后代,以B為例,可以以此往上找他的各級祖先,從哪先走的,我剛才這兒沒有寫嗎,0X6012,先找到C,再找到A,再找到E,到頂了到根了,這就是我給大家所講的關于樹和二叉樹的一些基本的概念,包括他的一些基礎的知識,二叉樹我們還講了講他的存儲結(jié)構(gòu),再次說明一下,二叉樹是我們研究最多的樹,一般是采用鏈式存儲結(jié)構(gòu)的,這個我們稱之為二叉鏈表,這個怎么是二叉樹呢,這不是有三部分嗎,三部分有一部分是存數(shù)據(jù)的,有兩部分是分叉的,這個是三叉鏈表,三叉鏈表就是增加了一找父親的,這樣的一個指針,在這個基礎上,這個講完以后,我們就可以來講二叉樹的實現(xiàn)了我們就要寫相關的代碼了,來實現(xiàn)二叉樹的各種操作了

?

總結(jié)

以上是生活随笔為你收集整理的树和二叉树的基本概念(二级)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。