演算法二叉搜尋樹的插入刪除操作
阿新 • • 發佈:2018-12-24
1、二叉搜尋樹的節點新增操作
public class Solution {
/**
* @param root: The root of the binary search tree.
* @param node: insert this node into the binary search tree
* @return: The root of the new binary search tree.
*/
public TreeNode insertNode(TreeNode root, TreeNode node) {
if (root==null){
return node;
}else if(root.val<=node.val){
root.right=insertNode(root.right,node);
}else{
root.left=insertNode(root.left,node);
}
return root;
}
}
2、二叉搜尋樹的節點刪除操作
思路
若要刪除一個BST的一個結點,需要考慮如下三種情況:
- 需要刪除的節點下並沒有其他子節點
- 需要刪除的節點下有一個左子節點(或者右子節點)
- 需要刪除的節點下有兩個子節點(左右子節點都存在)
對這三種情況分別採取的措施是:
- 直接刪除此結點
- 刪除此結點,將此結點父節點連線到此結點左(或者右)子樹
- 找出此結點右子樹中的最小結點(或者找出左子節點的最大節點),用以代替要刪除的結點,然後刪除右子樹中的此最小結點(或者刪除左子樹中的此最大節點)
java程式碼
/**
public TreeNode deleteNode(TreeNode root, int key) {
if(root == null){
return null;
}
if (key < root.val){
root.left = deleteNode(root.left, key);
}else if(key > root.val){
root.right = deleteNode(root.right, key);
}else{
if(root.left == null){
return root.right;
}else if(root.right == null){
return root.left;
}
TreeNode minNode = findMin(root.right);
root.val = minNode.val;
root.right = deleteNode(root.right, root.val);
}
return root;
}
private TreeNode findMin(TreeNode node){
while(node.left != null){
node = node.left;
}
return node;
}