1. 程式人生 > >演算法二叉搜尋樹的插入刪除操作

演算法二叉搜尋樹的插入刪除操作

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的一個結點,需要考慮如下三種情況:

  1. 需要刪除的節點下並沒有其他子節點
  2. 需要刪除的節點下有一個左子節點(或者右子節點)
  3. 需要刪除的節點下有兩個子節點(左右子節點都存在)

對這三種情況分別採取的措施是:

  1. 直接刪除此結點
  2. 刪除此結點,將此結點父節點連線到此結點左(或者右)子樹
  3. 找出此結點右子樹中的最小結點(或者找出左子節點的最大節點),用以代替要刪除的結點,然後刪除右子樹中的此最小結點(或者刪除左子樹中的此最大節點)

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; }