讓程式設計改變世界
change the world by program
不好意思哈,這節課又需要大家搞腦子了。對於知識,你理解的越多,需要記住的就越少!
上節課我們簡單的介紹了樹結構的強大,這節課我們來關心一下如何在記憶體中安排樹這種結構的存放。
說到儲存結構,就會想到我們前面章節講過的順序儲存和鏈式儲存兩種基本結構。
對於線性表來說,很直觀就可以理解,但對於樹這種一對多的結構,我們應該怎麼辦呢?
要儲存樹,簡單的順序儲存結構和鏈式儲存結構是不能滴!不過如果充分利用它們各自的特點,完全可以間接地來實現。
大家先思考下,如果你是總工程師,讓你來設計和規劃,你有多少種方法可以實現對樹結構的存放?
當然你要考慮到雙親、孩子、兄弟之間的關係。
小甲魚這裡要介紹三種不同的表示法:雙親表示法、孩子表示法、孩子兄弟表示法。
我們假設以一組連續空間儲存樹的結點,同時在每個結點中,附設乙個指示其雙親結點在陣列中位置的元素。
也就是說,每個結點除了知道自己是誰之外,還知道它的粑粑媽媽在**。
那麼我們可以做如下定義:parent.c
這樣的儲存結構,我們可以根據某結點的parent指標找到它的雙親結點,所用的時間複雜度是o(1),索引到parent的值為-1時,表示找到了樹結點的根。
可是,如果我們要知道某結點的孩子是什麼?那麼不好意思,請遍歷整個樹結構。
這真是麻煩,能不能改進一下呢?
魚油們怎麼看?
電視機前的小盆友們怎麼看?
當然可以,我們只需要稍微改變一下結構即可:
那現在我們又比較關心它們兄弟之間的關係呢?
儲存結構的設計是乙個非常靈活的過程,只要你願意,你可以設計出任何你想要的奇葩!
乙個儲存結構設計得是否合理,取決於基於該儲存結構的運算是否適合、是否方便,時間複雜度好不好等等。
不要拘泥於你所學過的有限的資料型別,要把思維放開些,放開些,放開些!
當你的思維放開了,世界就變小了!
當你的思維放開了,知識就變少了!
**:
資料結構和演算法 4 1 棧
用途 陣列,鍊錶,樹等一般用來作為資料儲存的工具,棧和佇列更多是用來作為構思程式演算法的輔助工具,用來執行某項特殊任務,例如handler中的messagequeue訊息佇列,activity棧等 受限訪問 陣列可以通過下標隨機訪問或遍歷,而棧和佇列訪問是受限的,即在特定時刻只有乙個資料項可以被讀取...
資料結構與演算法12 樹和樹的儲存結構
這是本次學習的第二個資料結構 樹。之前我們一直討論的是一對一的線性結構,無論是線性表也好,棧和佇列也罷,都是2p模式。可是現實生活中,3p 4p等現象比比皆是,例如乙個年輕的媽媽生了4個孩子,而每個孩子都不像他們的爸爸,那麼這類情況我們用線性結構的形式就不足以描述了!所以我們需要研究這種一對多的資料...
樹的儲存結構2 資料結構和演算法42
讓程式設計改變世界 change the world by program 我們這次換個角度來考慮,由於樹中每個結點可能有多棵子樹,可以考慮用多重鍊錶來實現。就像我們雖然有計畫生育,但我們還是無法確保每個家庭只養育乙個孩子的衝動,那麼對於子樹的不確定性也是如此。1.右圖中,樹的度為 2.如果我們用 ...