C語言實現 實現二叉查詢樹基本操作 迭代版

2021-08-20 03:24:03 字數 1506 閱讀 8454

實現二叉查詢樹基本操作

在這篇部落格我們已經記錄了二叉查詢樹插入查詢刪除的思路,使用遞迴很容易實現,因為樹的定義都是遞迴實現的,所以相對於遞迴,使用迭代完成上述操作就比較複雜了.

需要手動記錄該節點的父節點,因為要將父節點的子樹指向新節點

插入的節點是該父節點的左子樹還是右子樹,通過比較大小就可以確定

void searchtreeinsert_byloop(searchtreenode* root, searchtreetype key)

else

if(node->key < key)

else

if(node->key == key)

}//為空 插入新元素

if(node == null)

else

}}

查詢就沒什麼了,和遞迴一樣,比較大小,結束迴圈時node = null 就表示查詢未命中

遞迴版本的刪除就很複雜了,對於迭代,就更難了.

不過思路還是記錄兩個節點,pre_node (父節點) node(當前節點),

需要根據大小比較 node是pre_node 的左子樹還是右子樹

然後分四類情況討論,和遞迴一樣

這裡是刪除四種情況的圖示

void _searchtreeremove_byloop(searchtreenode** proot,searchtreetype key)

else

if(root->key < key)

else

if(root->key == key)

} //沒找到 需要刪除的節點

if(root == null)

// 如果刪除的節點是根節點

if(root == *proot)

//刪除節點 左右子樹都為空 的情況

if(root->lchild == null && root->rchild == null)

else

free(root);

root = null;

} //當前節點右空 左不空的情況

else

if(root->lchild != null && root->rchild == null)

else

free(root);

root = null;

} //上乙個的映象

else

if(root->rchild != null && root->lchild == null)

else

free(root);

root = null;

} else

if(root->rchild != null && root->lchild != null)

root->key = max->key;

//左子樹是根節點

if(pre_max == null)

else

}}

二叉查詢樹C語言實現

二叉查詢樹c語言實現 1.二叉查詢樹的定義 左子樹不為空的時候,左子樹的結點值小於根節點,右子樹不為空時,右子樹的結點值大於根節點,左右子樹分別為二叉查詢樹 2.二叉查詢樹的最左邊的結點即為最小值,要查詢最小值,只需遍歷左子樹的結點直到為空為止,同理,最右邊的結點結尾最大值,要查詢最大值,只需遍歷右...

二叉查詢樹 C語言實現

二叉查詢樹 若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值 若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值 它的左 右子樹也分別為二叉查詢樹。在使用遞迴的時候,假如函式有返回值,記得接收返回值,並且保證函式在每個板塊結束後都有return,以防出錯。具體見find ins...

二叉查詢樹 C語言實現

構造一顆二叉查詢樹,實現樹的插入 刪除等基本操作 include includetypedef struct node node,pnode int array 100 按序儲存遍歷後的元素 int k 0 陣列array長度 初始化一顆二叉排序樹 pnode init 插入結點 void inse...