3 普通節點的刪除
3.1 刪除的節點沒有左子樹,也沒有右子樹
測試用例1: 刪除節點6
/* * * 10 *****=> 10 * / \ \ * 6 15 15 * */ static void test8() 測試用例2: 刪除節點15
/* * * 10 *****=> 10 * / \ / * 6 15 6 * */ static void test9() 那麼**應該怎麼編寫呢?
status _delete_node_from_tree(tree_node* ptreenode) free(ptreenode); return true; }
3.2 刪除的節點有左子樹,沒有右子樹
測試用例1: 測試節點6
/* * * 10 *****=> 10 * / / * 6 3 * / * 3 */ static void test10() 測試用例2: 刪除節點15
/* * * 10 *****=> 10 * \ \ * 15 12 * / * 12 */ static void test11() 新增左子樹不為空,右子樹為空的處理**,如下所示:
status _delete_node_from_tree(tree_node* ptreenode) else if(null != ptreenode->left_child && null == ptreenode->right_child) free(ptreenode); return true; }
3.3 刪除的節點左子樹為空,右子樹節點不為空
測試用例1: 刪除資料6
/* * * 10 *****=> 10 * / / * 6 8 * \ * 8 */ static void test12() 測試用例2: 刪除資料15
/* * * 10 *****=> 10 * \ \ * 15 20 * \ * 20 */ static void test13() 新增左子樹為空,右子樹不為空的處理情形。**如下:
status _delete_node_from_tree(tree_node* ptreenode) else if(null != ptreenode->left_child && null == ptreenode->right_child)else if(null == ptreenode->left_child && null != ptreenode->right_child) free(ptreenode); return true; }
3.4 刪除的節點左右子樹均不為空,不過又要分為兩種情形:
1) 左節點是刪除節點左側的最大節點 (刪除節點6)
/* * * 10 *****=> 10 * / / * 6 5 * / \ \ * 5 8 8 */ static void test14()
2) 左節點不是刪除節點左側的最大節點(刪除節點5)
/* * * 10 *****=> 10 * / / * 5 4 * / \ / \ * 2 6 2 6 * \ * 4 */ static void test15() 那麼針對這兩種型別,我們的**究竟應該怎麼處理呢?
status _delete_node_from_tree(tree_node* ptreenode) else if(null != ptreenode->left_child && null == ptreenode->right_child)else if(null == ptreenode->left_child && null != ptreenode->right_child)elseelse } free(ptreenode); return true; }
結束總結:
上面的過程記錄了我們的**是怎麼一步一步走過來的。最後我們給出乙份完整的節點刪除**:
status _delete_node_from_tree(tree_node* ptreenode) else if(null != ptreenode->left_child && null == ptreenode->right_child)else if(null == ptreenode->left_child && null != ptreenode->right_child)elseelse } free(ptreenode); return true; } status delete_node_from_tree(tree_node** pptreenode, int data) else if(null != ptreenode->left_child && null == ptreenode->right_child)else if(null == ptreenode->left_child && null != ptreenode->right_child)elseelse } free(ptreenode); return true; } return _delete_node_from_tree(ptreenode); }
一步一步寫演算法(之排序二叉樹)
前面我們講過雙向鍊錶的資料結構。每乙個迴圈節點有兩個指標,乙個指向前面乙個節點,乙個指向後繼節點,這樣所有的節點像一顆顆珍珠一樣被一根線穿在了一起。然而今天我們討論的資料結構卻有一點不同,它有三個節點。它是這樣定義的 cpp view plain copy print?typedef struct ...
一步一步寫演算法(之排序二叉樹)
前面我們講過雙向鍊錶的資料結構。每乙個迴圈節點有兩個指標,乙個指向前面乙個節點,乙個指向後繼節點,這樣所有的節點像一顆顆珍珠一樣被一根線穿在了一起。然而今天我們討論的資料結構卻有一點不同,它有三個節點。它是這樣定義的 cpp view plain copy typedef struct tree n...
一步一步寫演算法(之排序二叉樹)
前面我們講過雙向鍊錶的資料結構。每乙個迴圈節點有兩個指標,乙個指向前面乙個節點,乙個指向後繼節點,這樣所有的節點像一顆顆珍珠一樣被一根線穿在了一起。然而今天我們討論的資料結構卻有一點不同,它有三個節點。它是這樣定義的 cpp view plain copy typedef struct tree n...