二元搜尋樹(BST)的節點插入是資料結構中的基礎操作。雖然邏輯單純,但涉及指標操作、遞歸與迭代選擇、以及測試驅動開發(TDD)的實踐。本文將一步步拆解插入邏輯,從參數檢查到根節點建立、子樹遞歸尋找位置,並附上完整的 C 語言程式碼與測試案例。
二元搜尋樹插入主要分為兩大步驟:
採用 TDD 方式,分三個階段逐步完善功能:
STATUS insert_node_into_tree(TREE_NODE** ppTreeNode, int data) {
if (NULL == ppTreeNode)
return FALSE;
return TRUE;
}
測試案例:傳入 `NULL` 指標,預期返回 `FALSE`。
static void test1() {
assert(FALSE == insert_node_into_tree(NULL, 10));
}
STATUS insert_node_into_tree(TREE_NODE** ppTreeNode, int data) {
if (NULL == ppTreeNode)
return FALSE;
if (NULL == *ppTreeNode) {
*ppTreeNode = (TREE_NODE*)create_tree_node(data);
assert(NULL != *ppTreeNode);
return TRUE;
}
return TRUE; // 此處暫時未處理非空樹情況
}
測試案例:插入第一個節點,驗證根節點資料正確性。
static void test2() {
TREE_NODE* pTreeNode = NULL;
assert(TRUE == insert_node_into_tree(&pTreeNode, 10));
assert(10 == pTreeNode->data);
free(pTreeNode);
}
引入輔助函數 `_insert_node_into_tree`,傳入父節點指標以利未來擴充(如線索化、平衡因子更新)。
STATUS _insert_node_into_tree(TREE_NODE** ppTreeNode, int data, TREE_NODE* pParent) {
if (NULL == *ppTreeNode) {
*ppTreeNode = create_tree_node(data);
assert(NULL != *ppTreeNode);
(*ppTreeNode)->parent = pParent; // 維護父節點指標
return TRUE;
}
if (data < (*ppTreeNode)->data)
return _insert_node_into_tree(&(*ppTreeNode)->left_child, data, *ppTreeNode);
else if (data > (*ppTreeNode)->data)
return _insert_node_into_tree(&(*ppTreeNode)->right_child, data, *ppTreeNode);
else
return FALSE; // 資料已存在,不重複插入
}
STATUS insert_node_into_tree(TREE_NODE** ppTreeNode, int data) {
if (NULL == ppTreeNode)
return FALSE;
if (NULL == *ppTreeNode) {
*ppTreeNode = (TREE_NODE*)create_tree_node(data);
assert(NULL != *ppTreeNode);
return TRUE;
}
return _insert_node_into_tree(ppTreeNode, data, NULL);
}
測試案例:驗證左、右子節點正確掛載。
static void test3() {
TREE_NODE* pTreeNode = NULL;
assert(TRUE == insert_node_into_tree(&pTreeNode, 9));
assert(TRUE == insert_node_into_tree(&pTreeNode, 8));
assert(TRUE == insert_node_into_tree(&pTreeNode, 10));
assert(9 == pTreeNode->data);
assert(8 == pTreeNode->left_child->data);
assert(10 == pTreeNode->right_child->data);
// 記憶體釋放略
}
為確保遞歸邏輯健壯性,建議至少涵蓋以下 9 類測試場景:
二元搜尋樹插入的關鍵在於指標的指標操作與遞歸終止條件的精確把控。透過 TDD 逐步遞進,能有效避免指標錯誤與邏輯遺漏,打造高可靠度的資料結構庫。