不好意思哈,這節課又需要大家搞腦子了。對於知識,你理解的越多,需要記住的就越少!
上節課我們簡單的介紹了樹結構的強大,這節課我們來關心一下如何在記憶體中安排樹這種結構的存放。
說到儲存結構,就會想到我們前面章節講過的順序儲存和鏈式儲存兩種基本結構。
對於線性表來說,很直觀就可以理解,但對於樹這種一對多的結構,我們應該怎麼辦呢?
要儲存樹,簡單的順序儲存結構和鏈式儲存結構是不能滴!不過如果充分利用它們各自的特點,完全可以間接地來實現。
大家先思考下,如果你是總工程師,讓你來設計和規劃,你有多少種方法可以實現對樹結構的存放?
當然你要考慮到雙親、孩子、兄弟之間的關係。
小甲魚這裡要介紹三種不同的表示法:雙親表示法、孩子表示法、孩子兄弟表示法。
我們假設以一組連續空間儲存樹的結點,同時在每個結點中,附設乙個指示其雙親結點在陣列中位置的元素。
也就是說,每個結點除了知道自己是誰之外,還知道它的粑粑媽媽在**。
// 樹的雙親表示法結點結構定義
#define max_tree_size 100
typedef int elemtype;
typedef struct ptnode
ptnode;
typedef struct
ptree;
這樣的儲存結構,我們可以根據某結點的parent指標找到它的雙親結點,所用的時間複雜度是o(1),索引到parent的值為-1時,表示找到了樹結點的根。
可是,如果我們要知道某結點的孩子是什麼?那麼不好意思,請遍歷整個樹結構。
這真是麻煩,能不能改進一下呢?
魚油們怎麼看?
電視機前的小盆友們怎麼看?
當然可以,我們只需要稍微改變一下結構即可:
那現在我們又比較關心它們兄弟之間的關係呢?
儲存結構的設計是乙個非常靈活的過程,只要你願意,你可以設計出任何你想要的奇葩!
乙個儲存結構設計得是否合理,取決於基於該儲存結構的運算是否適合、是否方便,時間複雜度好不好等等。
不要拘泥於你所學過的有限的資料型別,要把思維放開些,放開些,放開些!
當你的思維放開了,世界就變小了!
當你的思維放開了,知識就變少了!
樹的儲存結構
樹的儲存結構 樹的存貯結構有多種表示方法,比較典型的乃是順序結構和鍊錶結構兩類。順序存貯結構即向量,一般將樹結點按自上而下,自左至右的順序一一存放。如前文所介紹的完全二叉樹就可以採用順序存貯結構。1.雙親鍊錶表示法 順序儲存結構常用的有雙親表示法,這種方法在每個陣列元素中存放某個結點資訊和該結點的雙...
樹的儲存結構
樹的資料邏輯結構是一對n的,除了根節點,每個元素只有乙個前驅,但是可以有多個後繼,具有層次關係,像家譜就是乙個樹的例子。樹是有n個結點的有限集合,當n大於零時,這個樹有且僅有乙個稱為根的結點,從根節點延申出來的元素可以時n個,同時可以再延申。n 0時,該樹就是空樹。樹的第一層就是根結點,第二層都是稱...
樹的儲存結構
1 第一行乙個n,代表這個樹有n個節點,接下來輸入n行,第i行輸入兩個數字,li,ri,代表第i個節點的左兒子右兒子 節點序號從1編號到n 如果沒有左兒子或者右兒子,就用 1代替,輸出它的層序遍歷 include include include using namespace std struct ...