實現二叉查詢樹基本操作
在這篇部落格我們已經記錄了二叉查詢樹插入查詢刪除的思路,使用遞迴很容易實現,因為樹的定義都是遞迴實現的,所以相對於遞迴,使用迭代完成上述操作就比較複雜了.
需要手動記錄該節點的父節點,因為要將父節點的子樹指向新節點
插入的節點是該父節點的左子樹還是右子樹,通過比較大小就可以確定
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...