原理:按照大的向右小的向左原則,沿著樹的根節點往下找,找到第乙個為空的節點或者節點的key和目標key相同時結束,前者插入,後者替換。
/**
*@description: 插入節點
*@param key
*@param value
*@author wjc920
*@date 2023年6月26日
*/public
void
put(k key, v value)
node cur=root;
while(true)
cur=cur.left;
}else
if (cmp > 0)
cur=cur.right;
}else
}}
注:非遞迴
原理:按照大的向右小的向左原則,沿著樹的根節點往下找,找到第乙個為空的節點或者節點的key和目標key相同時結束,前者返回空,後者返回值。
/**
*@description: 獲取鍵key的值
*@param key
*@return
*@author wjc920
*@date 2023年6月26日
*/public v get(k key)
private node get(node node, k key)
原理:按照大的向右小的向左原則,沿著樹的根節點往下找,找到第乙個為空的節點或者節點的key和目標key相同時結束,前者不執行任何操作,後者需要分情況處理:
1. 若待刪除的節點只有乙個子節點(對應**中情況2和3),則用子節點替換該節點即可,結束;
2. 若待刪除節點沒有子節點(對應**中情況4),直接刪除,結束;
3. 若待刪除節點有兩個子節點(對應**中情況1),則查詢該節點的後繼節點,兩者交換,然後將後繼節點設定為待刪除節點,此時回到情況1或2。
/**
*@description: 刪除操作的非遞迴實現
*@param key
*@return
*@author wjc920
*@date 2023年6月30日
*/public v remove(k key) else
if (cmp > 0) else
//尋找target,target.key==key
break; //尋找target,target.key==key
}target=cur;
if(target==null) //如果target==null,則不需要刪除,返回null
return
null; //如果target==null,則不需要刪除,返回null
result=target.value; //如果target!=null,則需要刪除,先將target的value儲存,作為返回結果
if(target.left!=null) //找後繼節點,即大於target的最小節點
replace=cur; //將後繼節點替換tagert
target.key=replace.key; //將後繼節點替換tagert
target.value=replace.value; //將後繼節點替換tagert
if(replace.right!=null) else else //刪除replace
}}else
}else else else }}
return result;
}
二叉搜尋樹 增刪查
性質 每個節點的key值各不相同 左子樹上所有節點的key值小於根結點 右子樹上的所有節點key值大於根結點 左右子樹都是二叉搜尋樹 insert插入 bool insert const k key 非遞迴插入 node cur root node parent null while cur els...
二叉搜尋樹的增刪查改
在實際生產中,一棵二叉搜尋樹的平均深度是log n 所以通常是遞迴的編寫二叉樹的操作 不需要太擔心爆棧的問題。對二叉樹的所有操作,無非就是從根節點 左子樹 右子樹這三者中入手,分析基本的 可能的情況後,再遞迴的編寫相應的操作即可。我們的重點放在insert 操作和 delete 操作中。insert...
二叉搜尋樹的增刪改查
二叉搜尋樹 binary search tree 簡稱 bst,是一種特殊形式的二叉樹。二叉搜尋樹的的結構有兩種可能 對於二叉搜尋樹,需要掌握基本的操作 當要查詢目標值的節點時,我們可以根據二叉樹的結點資料值的有序性 左孩子 根結點 右孩子 根據以下思路進行查詢 簡單實現 返回以目標值結點為根結點的...