二叉樹的節點插入比較簡單。一般來說,二叉樹的插入主要分為以下兩個步驟:
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...