删除BST中的节点

时间:2014-04-12 00:24:19

标签: binary-search-tree

这不是作业。我完全被封锁了。我知道该怎么做,但我操纵树很困难。请帮忙。

我正在尝试从BST中删除节点。我能够查找并查找父项并将其存储为树。

package com.test.binarytree;


public class BinaryTreeDelete {
private Node root;

//create null binary tree
public BinaryTreeDelete(){
    root = null;
}

//delete
public void delete(int target){
    root = delete(root, target);
}

public Node delete(Node node, int target){  
    NodeWithParent temp = lookupFindParent(root, null, target);

    if( node == null){
        return null;
    }
    else{
        if( node.left == null || node.right == null) //leaf node
        {
            //WHAT DO I DO HERE
            //temp.parent.left = null;
            //temp.parent.right = null;
            //return null; 
        }
        if( node.left != null && node.right == null ) //one child only on left
        {
            //WHAT DO I DO HERE
        }
        if( node.right != null && node.left == null ) //one child only on right
        {
            //WHAT DO I DO HERE
        }
        if( node.left != null && node.right != null ) //two children
        {
            //WHAT DO I DO HERE
        }
    }

    return null;
}

private NodeWithParent lookupFindParent(Node node, Node parentNode, int target){
    if( node == null ){
        return null;
    }

    if( node.data == target){
        return new NodeWithParent(node, parentNode);
    }
    else if( node.data > target ){
        parentNode = node;
        return lookupFindParent(node.left, parentNode, target);
    }
    else{
        parentNode = node;
        return lookupFindParent(node.right, parentNode, target);
    }
}

//insert
public void insert(int data){
    root = insert(root, data);
}

public Node insert (Node node, int data){
    if(node == null){
        node = new Node(data);
    }
    else{
        if( data <= node.data ){
            node.left = insert(node.left, data);
        }
        else{
            node.right = insert(node.right, data);
        }
    }

    return node;
}

//print tree
public void printTree(){
    printTree(root);
    System.out.println();
}

//print tree
private void printTree(Node node) {
     if (node == null) return;

     // left, node itself, right
     printTree(node.left);
     System.out.print(node.data + "  ");
     printTree(node.right);
} 
//node class
public static class Node{
    Node left;
    Node right;
    int data;

    Node(int newNode){
        data = newNode;
        left = null;
        right = null;
    }
}

//node class
public static class NodeWithParent{
    Node current;
    Node parent;

    NodeWithParent(Node current, Node parent){
        this.current = current;
        this.parent = parent;
    }
}

public static void main(String[] args) {
    BinaryTreeDelete bt = new BinaryTreeDelete();   

    //insert with inserts - tree increases on right if inserted in order
    bt = new BinaryTreeDelete();
    bt.insert(5);
    bt.insert(3);
    bt.insert(7);
    bt.insert(1);
    bt.insert(4);
    bt.insert(6);
    bt.insert(9);
    bt.printTree();
    //bt.delete(3);
    //bt.delete(4);
    //bt.delete(6);
    bt.delete(9);
    //bt.delete(5);
    bt.printTree();
}

}

1 个答案:

答案 0 :(得分:0)

我将为您提供如何删除BST中的节点的逻辑(这意味着您必须自己编写代码)。

有三种情况。

  1. 要删除的节点将左右子节点都设为null:删除节点并使父节点为空。
  2. 要删除的节点有左或右子(但不是两者)为null:删除节点但确保父节点指向要删除的节点的有效子节点。
  3. 要删除的节点将nether left child和right child作为null:在这种情况下,您必须找到要删除的节点的下一个更大元素。下一个更大的元素是要删除的节点的右子树的最小元素。由于这是最少的元素,因此它的至少一个子元素为null。因此,将要删除的节点的值与下一个更大的节点交换。交换后,使用第1点和第2点删除下一个更大的节点(取决于哪种情况)。现在,为什么下一个更大的节点而不是任何节点。因为如果用下一个更大的节点替换节点,则BST仍然是BST。在一个例子中试一试,它会很清楚。