排序二叉樹的儲存和載入

2021-06-16 08:00:15 字數 1339 閱讀 7555

排序二叉樹是我們開發中經常使用到的一種資料結構,它具有較好的插入、刪除、查詢特性。但是由於二叉樹的指標較多,所以相比較其他的資料結構而言,二叉樹來得比較麻煩些。但是也不是沒有辦法,下面介紹一下我個人常用的方法。

我們知道,如果乙個二叉樹是乙個滿樹的話,那麼二叉樹的節點應該是按照1、2、3、4依次排開的。但是現實情況是這樣的,由於排序二叉樹自身的特性,某個分支節點常常可能左半邊有分支,右半邊沒有分支;或者是右半邊有分支,左半邊沒有分支。那麼在資料中節點的順序很可能是不連貫的了。

但是,對於某乙個節點來說,它的左分支節點、右分支節點和父節點之間還是存在著某種聯絡的。比如說,如果父節點的順序是n,那麼它的左節點只能是n*2,右邊節點只能是2*n+1。那麼,我們能不能利用父節點和子節點之間的關係來進行資料的儲存呢?答案當然是肯定的。

首先,我們需要對資料結構重新定義一下,其中number記錄序列號:

typedef struct _tree_node

tree_node;

那麼原來新增資料的函式也要做出修改?

status _insert_node_into_tree(tree_node* ptreenode, int data)

else

ptreenode = ptreenode->left_child;

}elseelse

ptreenode = ptreenode->right_child;

} }return true;

}status insert_node_into_tree(tree_node** pptreenode, int data)

return _insert_node_into_tree(*pptreenode, data);

}

那麼,此時儲存的時候放在硬碟裡面的資料應該有哪些呢?我們在遍歷每乙個節點的時候,只需要把對應的資料和序列號依次放到硬碟即可。

typedef struct _data

data;

儲存的資料總要再次啟用吧?怎麼載入呢?很簡單,四個步驟:

1)根據記錄的節點總數分配n*sizeof(tree_node)空間;

2)依次從硬碟中取出data資料,把它們複製給tree_node,暫時left_side和right_side指標為空;

3)對於對於每乙個節點n,尋找它的父節點n>>1,填充left_side或者是right_side,並且根據(n%2)是否為1判斷當前節點是左節點還是右節點;

4)獲取n=1的節點,那麼這個節點就是我們需要尋找的根節點,至此資料就載入完畢。

二叉樹,排序二叉樹

說到二叉樹,這可是資料結構裡面的非常重要的一種資料結構,二叉樹是樹的一種,本身具有遞迴性質,所以基於二叉樹的一些演算法很容易用遞迴演算法去實現。作為一種非線性結構,比起線性結構還是相對複雜的,很多人甚至看不懂演算法的意思,不能理解。其實一開始接觸這些東西還是挺暈的,不過你多看幾遍,上機實現可能你就會...

排序二叉樹or搜尋二叉樹or查詢二叉樹

排序二叉樹,搜尋二叉樹,查詢二叉樹都是乙個意思,只是叫法不同而已。下面的文章中我們統稱為排序二叉樹。本文主要是針對高中資訊學,因此其中不涉及到指標,所有需要用指標的地方都直接使用陣列進行模擬。排序二叉樹定義 1 若左子樹不空,則左子樹上所有結點的值均小於或等於它的根結點的值 2 若右子樹不空,則右子...

排序二叉樹or搜尋二叉樹or查詢二叉樹

排序二叉樹,搜尋二叉樹,查詢二叉樹都是乙個意思,只是叫法不同而已。下面的文章中我們統稱為排序二叉樹。本文主要是針對高中資訊學,因此其中不涉及到指標,所有需要用指標的地方都直接使用陣列進行模擬。排序二叉樹定義 1 若左子樹不空,則左子樹上所有結點的值均小於或等於它的根結點的值 2 若右子樹不空,則右子...