二叉樹學習到現在基本上告一段落了,老師的進度已經完成,剩下的就是我們自己的事情了,比如好好複習,做完剩下的練習題目。
對於我還沒有做出來的那個練習題,我心中其實只有一點點想法,比如說在交換的時候變化指向左右子樹的指標,但是這個過程是個遞迴的過程,如何把握使兩個節點只交換一次,應該是需要考慮的內容之一……吧?還有就是怎麼交換指標,需要交換的是這個節點的兩個子節點,應該可以參考單鏈的操作?
總之既然能有人做出來,那麼這個題就不是不能被做出來的題目。
所以……下節課這個題目應該會被完結了,正式開啟圖論副本,可是圖論好難的亞子……連老師都說難嗚嗚嗚,平時做的題目都是陣列鄰接表儲存的模式,說實話用鍊錶還真少。包括以前的一些內容,我可憐的陣列都被拋棄了嗚嗚嗚,畢竟陣列只要找到邏輯規律就很容易寫了,可是鍊錶是實打實的又難思考又難寫,還要寫個class,真是的!
咳咳咳,學習學習。
二叉樹的順序儲存結構就是用一維陣列儲存二叉樹中的結點,並且結點的儲存位置(下標)應能體現結點之間的邏輯關係——父子關係。
就是讓一棵棵二叉樹先變成完全二叉樹的編號,然後去掉沒有的節點,用陣列儲存存在的節點。
這個儲存的條件,是利用了二叉樹的父子節點的下標之間的關係:
父親節點 的編號是子節點的兩倍,所以父親節點除以二是左孩子,除以二加一是右孩子。
完全二叉樹的下標是從一開始到節點數目結束,所以開的陣列大小可算,如果是只告訴你數目以及下標,完全可以依靠最大的下標來開陣列(比如就開這麼大)
左右子樹按照這個方法找,賦值同。所以順序儲存很簡單,很開心。
基本思想:令二叉樹的每個結點對應乙個鍊錶結點,鍊錶結點除了存放與二叉樹結點有關的資料資訊外,還要設定指示左右孩子的指標。
節點結構:
data:資料域,存放該結點的資料資訊;
lchild:左指標域,存放指向左孩子的指標;
rchild:右指標域,存放指向右孩子的指標。
**:
template struct binode
;
對於乙個穩穩的二叉鍊錶,我們需要知道的除了節點的構造,最重要的就是函式怎麼寫。
二叉鍊錶函式的寫法十分簡單,但是還是需要很多注意事項;
**:
template class bitree
//為什麼不直接寫在這裡面呢?因為這裡需要呼叫根節點,然鵝根節點是私有的,我們不能呼叫,所以才直接讓這個函式呼叫。
void inorder()
void postorder()
void levelorder();
private:
binode*root;
binode* creat( );
void preorder(binode*root);
void inorder(binode*root);
void postorder(binode*root);
void levelorder(binode*root);
};
剩下的那些內容,自己查書就好了,都不是很難,但是要記住關鍵點。
最難的是建構函式,其他的都不太需要動腦子。
二叉樹的建立需要依靠一種名叫拓展二叉樹的樹,就是把所有節點的空節點都補成#的一種二叉樹,對它進行前序遍歷形成的序列叫做拓展前序二叉序列。
按擴充套件前序遍歷序列輸入結點的值
如果輸入結點值為「#」,則建立一棵空的子樹
否則,根結點申請空間,將輸入值寫入資料域中,
以相同方法的建立根結點的左子樹
以相同的方法建立根結點的右子樹
**:
template bitree ::bitree()//這是public裡面的
template binode* bitree ::creat()
return root
}
非遞迴遍歷的那些不好用,就不寫了……反正我也會遞迴的。
思路:節點數目=左子樹節點數目+右子樹節點數目+1
*遞迴
邊界條件:節點為空
思路:葉子數目=左葉子+右葉子;
邊界條件:葉子空返回1,自己空返回0
思路:深度=max(左子樹的深度,右子樹的深度)+1;
邊界條件:節點為空返回0
最優二叉樹是所有葉子節點的權值乘路徑長度相加,得到的值最小的一棵樹。
權值越大的葉子結點越靠近根結點,而權值越小的葉子結點越遠離根結點。
只有度為0(葉子結點)和度為2(分支結點)的結點,不存在度為1的結點.
⑴ 初始化:由給定的n個權值構造n棵只有乙個根結點的二叉樹,從而得到乙個二叉樹集合f=;
⑵ 選取與合併:在f中選取根結點的權值最小的兩棵二叉樹分別作為左、右子樹構造一棵新的二叉樹,這棵新二叉樹的根結點的權值為其左、右子樹根結點的權值之和;
⑶ 刪除與加入:在f中刪除作為左、右子樹的兩棵二叉樹,並將新建立的二叉樹加入到f中;
⑷ 重複⑵、⑶兩步,當集合f中只剩下一棵二叉樹時,這棵二叉樹便是哈夫曼樹。
二叉樹的儲存結構
二叉樹是非線性結構,即每個資料結點至多只有乙個前驅,但可以有多個後繼。它可採用順序儲存結構和鏈式儲存結構。1 順序儲存結構 二叉樹的順序儲存,就是用一組連續的儲存單元存放二叉樹中的結點。因此,必須把二叉樹的所有結點安排成為乙個恰當的序列,結點在這個序列中的相互位置能反映出結點之間的邏輯關係,用編號的...
二叉樹的儲存結構
二叉樹是非線性結構,即每個資料結點至多只有乙個前驅,但可以有多個後繼。它可採用順序儲存結構和鏈式儲存結構。1 順序儲存結構 二叉樹的順序儲存,就是用一組連續的儲存單元存放二叉樹中的結點。因此,必須把二叉樹的所有結點安排成為乙個恰當的序列,結點在這個序列中的相互位置能反映出結點之間的邏輯關係,用編號的...
二叉樹的儲存結構
二叉樹是非線性結構,即每個資料結點至多只有乙個前驅,但可以有多個後繼。它可採用順序儲存結構和鏈式儲存結構。1 順序儲存結構 二叉樹的順序儲存,就是用一組連續的儲存單元存放二叉樹中的結點。因此,必須把二叉樹的所有結點安排成為乙個恰當的序列,結點在這個序列中的相互位置能反映出結點之間的邏輯關係,用編號的...