二叉樹輸入與儲存的問題

2022-04-11 11:27:10 字數 1152 閱讀 6198

這幾天在寫資料結構中的二叉樹遍歷時,發現最困擾的問題是遞迴與非遞迴,dfs,bfs的實現需要建立在完整的二叉樹結構上。

看了幾篇部落格後,我把自己對於二叉樹建立時的注意事項與大家分享下:

二叉樹的建立主要有陣列與鍊錶兩種形式,如果建立的是完全二叉樹,本人推薦使用陣列,用下標進行容易理解,出錯率低。今天我主要介紹的是使用鍊錶儲存二叉樹。

在使用鍊錶儲存時一定要給子節點打上標記,你可以使用輸入0時到達子節點,也可以使用輸入#時到達子節點,取決於你輸入的資料是int還是char,使用鍊錶儲存時是使用遞迴前序法建樹,優點是**量少,容易理解。

下面直接上**:

定義樹的基本結構

typedef

struct node

tree;

tree* root;

遞迴法建立二叉樹

tree*

input()

else root=

null

;return root;

}

這裡因為我後面的操作是對字元操作所以我選擇了#最後結束標誌

那麼什麼時候輸入#呢:

遇到子節點輸入節點字元之後需要連續輸入兩個#因為他的左右節點都是空的所以需要輸入兩個,如果該節點右子樹為空則在輸入該節點字元後輸入乙個#,原因同上。

接下來我使用的是bfs遍歷二叉樹,網上dfs**很多而且很簡單就不多贅述,我分享bfs**給大家

void

bfs(tree* a)

else

return

;while

(!q_tree.

empty()

)if(node->rc!=

null

) q_tree.

pop();

}}

主函式

int

main()

下面我先講解一下這裡的bfs遍歷,bfs就是廣度優先搜尋,與dfs深度優先搜尋齊名,dfs主要是採用遞迴的方法由第一層遍歷到最後一層再回溯,而bfs是利用佇列這個資料結構將要訪問的節點暫時儲存下來,達到一行一行訪問的效果。因為採取的是先根節點再左節點,右節點的順序輸出,所以在入佇列的時候先入隊左子樹再入隊右子樹。

二叉樹輸入與儲存的問題

這幾天在寫資料結構中的二叉樹遍歷時,發現最困擾的問題是遞迴與非遞迴,dfs,bfs的實現需要建立在完整的二叉樹結構上。看了幾篇部落格後,我把自己對於二叉樹建立時的注意事項與大家分享下 二叉樹的建立主要有陣列與鍊錶兩種形式,如果建立的是完全二叉樹,本人推薦使用陣列,用下標進行容易理解,出錯率低。今天我...

二叉樹的遍歷 二叉樹遍歷與儲存

在資料結構中,二叉樹是非常重要的結構。例如 資料庫中經常用到b 樹結構。那麼資料庫是如何去單個查詢或者範圍查詢?首先得理解二叉樹的幾種遍歷順序 先序 中序 後序 層次遍歷。先序 根節點 左子樹 右子樹 中序 左子樹 根節點 右子樹 後序 左子樹 右子樹 根節點 按層級 class node if c...

二叉樹建立的輸入問題

這幾天在看資料結構的二叉樹,被二叉樹建立時的輸入問題困擾很久。二叉樹的建立一般使用遞迴演算法,將所有節點的資料一股腦的輸入,遞迴無法停止,二叉樹就無法建立。感謝此博文,原來我們在輸入節點資料的時候,必須輸入空閒葉子節點,並用特殊符號標記,比如上述的博文的空閒葉子節點採用 0 作為標記符,就能完整建立...