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

2021-08-26 06:55:06 字數 1628 閱讀 7982

二叉樹的節點插入比較簡單。一般來說,二叉樹的插入主要分為以下兩個步驟:

1) 對當前的引數進行判斷,因為需要考慮到頭結點,所以我們使用了指標的指標作為函式的輸入引數

2) 分情況討論:

如果原來二叉樹連根節點都沒有,那麼這個新插入的資料就是根節點;

如果原來的二叉樹有根節點,那我們判斷這個資料是否存在過,如果存在,那麼返回;如果不存在,那麼繼續插入資料。

那繼續插入的資料怎麼儲存呢?又要分三種情況:

1)如果插入的資料小於當前節點的資料,那麼往當前節點的左子樹方向繼續尋找插入位置

2)如果插入的資料大於當前插入的位置,那麼往當前節點的右子樹方向繼續尋找插入位置

3)如果方向當前的節點為空,那麼表示插入的位置找到了,插入資料即可

演算法說了這麼多,下面即開始練習我們的**:

a)判斷輸入資料的合法性

status insert_node_into_tree(tree_node** pptreenode, int data) 此時,可以用乙個測試用例驗證一下

static void test1()

b)判斷當前根節點是否存在,修改**

status insert_node_into_tree(tree_node** pptreenode, int data) return true; } 修改了**,少不了測試用例的新增。

static void test2()

c)上面考慮了沒有根節點的情況,那麼如果根節點存在呢?

status _insert_node_into_tree(tree_node** pptreenode, int data, tree_node* pparent) if(data < (*pptreenode)->data) return _insert_node_into_tree(&(*pptreenode)->left_child, data, *pptreenode); else return _insert_node_into_tree(&(*pptreenode)->right_child, data, *pptreenode); } status insert_node_into_tree(tree_node** pptreenode, int data) return _insert_node_into_tree(pptreenode, data, null); } 上面的**已經考慮了不是根節點的情況。我們可以據此新增乙個測試用例。

static void test3() 由於上面的**是遞迴**,為了實現**的健壯性和完畢性,其實我們設計測試用例的時候應該至少包括9個測試用例:

(1) 引數非法

(2) 根節點不存在

(3)根節點存在,但是插入的資料已經存在

(4)根節點存在,插入資料為 9, 8

(5)根節點存在, 插入資料為9, 10

(6)根節點存在,插入資料為9,8, 7

(7)根節點存在,插入資料為9,7,8

(8)根節點存在,插入資料為7,8, 9

(9)根節點存在,插入資料為7,9,8

【預告: 下面一篇部落格主要介紹二叉樹的節點刪除】

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

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

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

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

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

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