二叉搜索树节点删除 java实现

图片展示见:

http://marcospring.iteye.com/blog/1623571
方法思路参考:
http://www.cnblogs.com/xunmengyoufeng/archive/2012/10/01/BityTree.html

代码实现:

package com.datestrut.searchTree;


/**
 * 
 * 二叉搜索树
 */

/*
 * 二叉树最复杂的步骤即为删除操作,此处只简单介绍一下具体思路:

(1)如果待删除的节点是一片树叶,那么它可以被立即删除。然后将其父节点的相应子节点(左节点或右节点)至空。

(2)如果被删除的节点有一个子节点,那么把它的子节点直接连到它的父节点上即可。(Node:current,parent)

(3)如果被删除的节点(a)有两个子节点,就不能简单的用它的一个子节点代替它。
        一般找到(a)的右子树中key最小的节点(c)代替它,
        如果c不为叶子节点,那么递归对c进行相应的删除操作。
   (Node:successorParent,successor,current)
 */
public class Tree {
    private Node root;

    public Tree() {
        root = null;
    }

    public Node getRoot(){
        return root;
    }

    //查找节点
    public Node find(int key) {
    Node current = root;
    while (current.iData != key) {
        if (key < current.iData) {
            current = current.leftChild;
        } else {
            current = current.rightChild;
        }
        if (current == null)
        return null;
    }
    return current;
    }

    public void insert(int id) {
        Node newNode = new Node();
        newNode.iData = id;
    if (root == null)
        root = newNode;
    else {
        Node current = root;
        Node parent;
        while (true) {
            parent = current;
            if (id < current.iData) {
                current = current.leftChild;
                if (current == null) {
                    parent.leftChild = newNode;
                    return;
                }
            } else {
                current = current.rightChild;
                if (current == null) {
                    parent.rightChild = newNode;
                    return;
                }
            }

        }
        }
    }


    //删除节点
    public boolean delete(int key) {
        Node current = root;
        Node parent = root;
        boolean isLeftChild = true;

        while (current.iData != key) {
            parent = current;
            if (key < current.iData) {
                isLeftChild = true;
                current = current.leftChild;
            } else {
                isLeftChild = false;
                current = current.rightChild;
            }
            if (current == null)
                return false;
        }

        // 叶子节点
        if (current.leftChild == null && current.rightChild == null) {
            if (current == root)
                root = null;
            else if (isLeftChild)
                parent.leftChild = null;
            else
                parent.rightChild = null;
        // 只有一个子节点
        } else if (current.rightChild == null) {
            if (current == root)
                root = current.leftChild;
            else if (isLeftChild)
                parent.leftChild = current.leftChild;
            else
                parent.rightChild = current.leftChild;
        } else if (current.leftChild == null) {
            if (current == root)
                root = current.rightChild;
            else if (isLeftChild)
                parent.leftChild = current.rightChild;
            else
                parent.rightChild = current.rightChild;
        }
        // 两个子节点
        else {
            Node successor = getSuccessor(current);

        //步骤三
        if (current == root) {
            root = successor;
        } else if (isLeftChild) {
            parent.leftChild = successor;
        } else
            parent.rightChild = successor;

        //步骤四
        successor.leftChild = current.leftChild;

    }

    return true;
    }

    private Node getSuccessor(Node delNode) {
        Node successorParent = delNode;
        Node successor = delNode;
        Node current = delNode.rightChild;

    while (current != null) {
        successorParent = successor;
        successor = current;
        current = current.leftChild;
    }
    if (successor != delNode.rightChild) {

    //步骤一
    successorParent.leftChild = successor.rightChild;

    //步骤二
    successor.rightChild = delNode.rightChild;
    }
    return successor;
    }

    //展示节点
    public void show(Node node){
        System.out.print(node.iData+" ");
    }

    //前序遍历 根左右
    public void DLR(Node node){
        if(node!=null){
            show(node);
            DLR(node.leftChild);
            DLR(node.rightChild);
        }
    }
}

class Node {
    public int iData;
    public Node leftChild;
    public Node rightChild;

    public void displayNode(){
         System.out.println('{' + iData + ',' + '}');
    }
}

测试代码:

package com.datestrut.searchTree;

public class Main
{

    public static void main(String[] args)
    {

        Tree tree = new Tree();
        /*for(int i=0;i<5;i++){
            tree.insert(i);
        }*/
        tree.insert(53);
        tree.insert(30);
        tree.insert(72);
        tree.insert(14);
        tree.insert(39);
        tree.insert(61);
        tree.insert(84);
        tree.insert(9);
        tree.insert(23);
        tree.insert(34);
        tree.insert(47);
        tree.insert(79);

        Node root = tree.getRoot();
        tree.DLR(root);
        System.out.println();
//        tree.delete(61);
//        tree.delete(84);
//        tree.delete(72);
        tree.delete(14);
        tree.DLR(root);
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
做一门精致,全面详细的 java数据结构与算法!!!让天下没有难学的数据结构,让天下没有难学的算法,不吹不黑,我们的讲师及其敬业,可以看到课程视频,课件,代码的录制撰写,都是在深夜,如此用心,其心可鉴,他不掉头发,谁掉头发???总之你知道的,不知道的,我们都讲,并且持续更新,走过路过,不要错过,不敢说是史上最全的课程,怕违反广告法,总而言之,言而总之,这门课你值得拥有,好吃不贵,对于你知识的渴求,我们管够管饱话不多说,牛不多吹,我们要讲的本门课程内容:稀疏数组、单向队列、环形队列、单向链表、双向链表、环形链表、约瑟夫问题、栈、前缀、中缀、后缀表达式、中缀表达式转换为后缀表达式、递归与回溯、迷宫问题、八皇后问题、算法的时间复杂度、冒泡排序、选择排序、插入排序、快速排序、归并排序、希尔排序、基数排序(桶排序)、堆排序、排序速度分析、二分查找、插值查找、斐波那契查找、散列、哈希表、二叉树、二叉树与数组转换、二叉排序树(BST)、AVL树、线索二叉树、赫夫曼树、赫夫曼编码、多路查找树(B树B+树和B*树)、图、图的DFS算法和BFS、程序员常用10大算法、二分查找算法(非递归)、分治算法、动态规划算法、KMP算法、贪心算法、普里姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法马踏棋盘算法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值