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

2021-08-26 07:00:24 字數 2468 閱讀 1032

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...