我們這樣規定:當我們插入乙個新的結點時,這個結點的關鍵字(也就是我們常說的結點的值)如果小於當前所在位置的結點,則插入到這個結點的左側,否則插入到這個結點的右側,這樣構建出來的二叉樹,總會有:乙個結點的左子樹的所有結點的值總是大於右子樹所有結點的值
插入乙個結點非常簡單,我們只需要在插入的時候比較值的大小插入即可,這個插入結點是乙個葉子結點
刪除結點的時候,如果是葉子結點,直接刪除,如果是分支結點,那我們必須在刪除之後仍然保持有序。
假如我們規定乙個結點的左子樹中的所有結點的關鍵字都小於右子樹所有結點的關鍵字,那麼這個時候,當我們準備刪除乙個分支結點時,我們採取的策略是:找到這個分支結點左子樹中的值最大的葉子結點或者是右子樹中值最小的乙個葉子結點,用這個葉子結點的值替換這個分支結點的值,刪除這個葉子結點,這樣,我們就不需要考慮這個分支結點前驅後繼結點的複雜關係,並且可以保證結點有序
首先我們判斷:
void
delet
(elementtype value)
// 如果是p結點左結點的右子樹最右端的乙個結點,讓這個結點的前驅結點的右指標指向這個最右端結點的左子樹,可以為空
else
// 最後,刪除結點值替換了p結點值的q結點
delete q;
}// 左子樹不存在,右子樹存在
else
if(p-
>right !=
null
)// 如果是p結點右結點的左子樹最左端的乙個結點,讓這個結點的前驅結點的左指標指向這個最左端結點的右子樹,可以為空
else
// 最後,刪除結點值替換了p結點值的q結點
delete q;
}// 是乙個葉子結點
else
delete p;
} std::cout <<
"delete value: "
<< e <<
" successfully!"
<< std::endl;}}
if(i > max_size ||
this
->data[i]
== default_value)
二叉排序樹的查詢,插入,刪除操作
二叉查詢樹 和二分查詢一樣,插入和查詢的時間複雜度均為o logn 但是在最壞的情況下仍然會有o n 的時間複雜度 include tree.h include using namespace std typedef struct bitnodebitnode 遞迴插入 bitnode recurs...
二叉查詢樹(二叉排序樹)建立,插入,刪除操作。
尋找節點就是直接依據數值的大小。從root節點開始遍歷,大於當前遍歷節點就向它的右子樹查詢,相反則查詢它的左子樹。然後返回。直接依據root節點,遍歷到最右就是最大節點,遍歷到最左,就是最小節點。插入節點我這裡插入的節點都會成為葉子節點。依據大小的關係向下遍歷,遍歷到最後的節點,然後插入就能夠了。這...
二叉排序樹 插入 刪除 查詢
原本是想寫關於android分享功能的部落格,但是沒真機不好去測試,大白天的手機被3歲娃娃,拿去看少兒頻道了,關於二叉排序樹的定義是 二叉排序樹或者是一棵空樹,或者是具有下列性質的二叉樹 1 若左子樹不空,則左子樹上所有結點的值均小於它的根結點的值 2 若右子樹不空,則右子樹上所有結點的值均大於它的...