一步一步寫演算法(之排序二叉樹的儲存和載入)

2021-08-26 07:38:22 字數 1299 閱讀 5941

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

我們知道,如果乙個二叉樹是乙個滿樹的話,那麼二叉樹的節點應該是按照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的節點,那麼這個節點就是我們需要尋找的根節點,至此資料就載入完畢。

一步一步寫演算法(之排序二叉樹)

前面我們講過雙向鍊錶的資料結構。每乙個迴圈節點有兩個指標,乙個指向前面乙個節點,乙個指向後繼節點,這樣所有的節點像一顆顆珍珠一樣被一根線穿在了一起。然而今天我們討論的資料結構卻有一點不同,它有三個節點。它是這樣定義的 cpp view plain copy print?typedef struct ...

一步一步寫演算法(之排序二叉樹)

前面我們講過雙向鍊錶的資料結構。每乙個迴圈節點有兩個指標,乙個指向前面乙個節點,乙個指向後繼節點,這樣所有的節點像一顆顆珍珠一樣被一根線穿在了一起。然而今天我們討論的資料結構卻有一點不同,它有三個節點。它是這樣定義的 cpp view plain copy typedef struct tree n...

一步一步寫演算法(之排序二叉樹)

前面我們講過雙向鍊錶的資料結構。每乙個迴圈節點有兩個指標,乙個指向前面乙個節點,乙個指向後繼節點,這樣所有的節點像一顆顆珍珠一樣被一根線穿在了一起。然而今天我們討論的資料結構卻有一點不同,它有三個節點。它是這樣定義的 cpp view plain copy typedef struct tree n...