鍊錶和陣列的取捨:
儘管鍊錶有許多方便之處(至少許多用鍊錶做的題我願意頂著麻煩用鍊錶寫而不是用許多陣列做一些複雜的操作來做)
從某種程度上說,手寫鍊錶的繁瑣帶來的是演算法上的莽撞,這固然不用太費腦力,但是卻容易「執行超時」。
作為最初級的資料結構,我認為陣列可以通過查詢的o(1)的優勢來出其不意解決一類問題。
那麼運用陣列巧妙解決問題的情況,我認為有以下幾個先決條件:
1、記憶體卡得不緊,以存放我們用於儲存各種各樣得對應關係得資訊得陣列
2、有充分得限制使得每個元素有比較明顯得特徵,從而能對應到乙個陣列上去,並且易於查詢
3、不容易被繞暈的頭腦
回顧高中數學競賽的知識,我們知道乙個數可以被k進製表示,當然每一位的係數的可能性比較多,我們不希望看到這樣。
而二進位制就只有0,1兩種係數,寫出來挺有美感的,更重要的是,給出從2^0,2 ^1,……2 ^k這k+1個數,他們可以表達出任何小於2 ^(k+1)-1的數.
我們確實可以考慮從正整數到二進位制序列的乙個對映,很幸運的是,我們有二叉樹這個結構,並且在每一層都是滿的情況下,我們就得到了一組2^0,2 ^1,……2 ^k這樣的單元。
所以我們理所當然得希望有乙個滿的二叉樹。
我們可以通過二進位制的性質確定非常多的資訊。
(1)首先是第幾行第幾個位置
(2)由1我們可以知道該節點的上乙個節點第幾層第幾個位置
(3)我們比較煩的奇偶分類問題也挺好解決的:前k個滿的層的節點數之和為奇數;當前層的節點數之和為偶數。
(4)左右邊是不是該節點的兄弟。
這個是滿的二叉樹,我們試著放寬這個要求
事實證明,再新的一層新增節點的時候,只要遵循從右到左或者從左到右的規律,似乎也能通過乙個十進位制數索引到對應的節點。
但是如果隨意新增那就哈哈哈哈
在滿足每層填充方向的情況下,我們可以知道,如果倒數第二層沒有填滿,那麼我們還是得不出什麼規律,所以我們希望乙個樹,它由乙個滿的二叉樹和最後一層組成(可能沒有排滿)
為了簡練又便於利用樹的深度,我們改這個性質為樹的葉節點只存在於最後兩層
啊這就是我們的完全樹!
我們建立了二進位制的二叉樹到十進位制數進而到用其作為索引的陣列的對映關係,但是有什麼用呢?就為了表示乙個樹?哦當然不是,我的朋友。年輕人要講武德,有了神奇的操作就要有合適的運用。
我們的二叉樹是不是經常拿來做查詢用?那我們從二叉查詢樹入手,自然就可以想到用這個對映出來的陣列模擬出二叉查詢樹的效果,實現用陣列帶來的降低複雜度的效果哈哈哈哈
於是就有了堆
堆疊堆疊,除了兩者都用鍊錶表示易於理解但我們學習的時候一般用陣列表示之外好像區別挺大的,至少我不會拿堆來處理字尾表示式。
說起來簡單,但寫起**來卻挺難的。
樹 二叉樹 滿二叉樹 完全二叉樹 堆 概念彙總
樹 乙個擁有n 個節點和n 1 條邊的乙個有向無環圖。二叉樹 每個節點最多有兩個子樹的樹結構。滿二叉樹 除最後一層無任何子節點外,每一層上的所有結點都有兩個子結點的二叉樹。完全二叉樹 由滿二叉樹而引出 二叉樹的深度為h,除第 h 層外,其它各層 1 h 1 的結點數都達到最大個數 滿二叉 樹 第 h...
二叉樹,完全二叉樹,滿二叉樹
二叉樹 是n n 0 個結點的有限集合,它或者是空樹 n 0 或者是由乙個根結點及兩顆互不相交的 分別稱為左子樹和右子樹的二叉樹所組成。滿二叉樹 一顆深度為k且有2 k 1個結點的二叉樹稱為滿二叉樹。說明 除葉子結點外的所有結點均有兩個子結點。所有葉子結點必須在同一層上。完全二叉樹 若設二叉樹的深度...
二叉樹 滿二叉樹和完全二叉樹
二叉樹是一種很重要的非線性資料結構,它是樹結構的一種重要的型別 它不是樹結構的特殊情況 其特徵是每個節點最多有兩個子樹。二叉樹的特點 二叉樹每個結點最多有 2個子結點,樹則無此限制 二叉樹中 結點的子樹 分成左子樹和右子樹,即使某結點只有一棵子樹,也要指明該子樹是左子樹,還是右子樹,就是說 二叉樹是...