Java实现二叉搜索树及相关操作

本文介绍了一种二叉搜索树的实现方式,并提供了插入、查找、删除等基本操作的代码示例。文中还包含了获取最小节点、最大节点的方法以及如何找到指定节点的后继节点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.tree;

import com.tree.BitNode;

/**
 *
 * 二叉搜索树:一个节点的左子节点的关键字小于这个节点。右子节点的关键字大于或等于这个父节点
 *
 * 注意:不适合插入同样关键字的节点
与平衡二叉树比較:不适合插入有序序列
 */
public class SearchBinTree {

    public static void main(String[] args) {

        BitNode root = new BitNode();
        root.data = 6;
        int[] arr = { 1, 3, 9, 7, 0, 4 };
        for (int i = 0; i < arr.length; i++) {
            insert(root, arr[i]);
        }
        BinTree.levelTraverse(root);
        BitNode successor = getSuccessor(root);
        System.out.println("successor:" + successor.data);


        System.out.println("delete : " + delete(root, 1));
        BinTree.levelTraverse(root);

        // BinTree.levelTraverse(root);
        //
        // BitNode min = getMinNode(root);
        // System.out.println("min = " + min.data);
        //
        // BitNode max = getMaxNode(root);
        // System.out.println("max = " + max.data);

    }

    // 构造二叉搜索树
    public static void insert(BitNode root, int data) {
        BitNode node = new BitNode();
        node.data = data;
        if (root == null) {
            root = node;
        } else {
            if (data < root.data) {
                if (root.lchild == null) {
                    root.lchild = node;
                } else {
                    insert(root.lchild, data);
                }
            } else {
                if (root.rchild == null) {
                    root.rchild = node;
                } else {
                    insert(root.rchild, data);
                }
            }

        }
    }

    // 查找最小节点
    public static BitNode getMinNode(BitNode root) {
        BitNode current, min = null;
        current = root;
        while (current != null) {
            min = current;
            current = current.lchild;
        }
        return min;
    }

    // 查找最大节点
    public static BitNode getMaxNode(BitNode root) {
        BitNode current, max = null;
        current = root;
        while (current != null) {
            max = current;
            current = current.rchild;
        }
        return max;
    }

    // 查找
    public static BitNode find(BitNode root, int data) {
        BitNode current = root;
        while (current.data != data) {
            if (data < current.data)
                current = current.lchild;
            else
                current = current.rchild;
            if (current == null)
                return null;
        }
        return current;
    }

    // 得到简要被删除的节点的后继(中序遍历)
    public static BitNode getSuccessor(BitNode delNode) {
        BitNode successorParent = delNode;
        BitNode successor = delNode;
        BitNode current = delNode.rchild;
        while (current != null) {
            successorParent = successor;
            successor = current;
            current = current.lchild;
        }

        if (successor != delNode.rchild) {
            successorParent.lchild = successor.rchild;
            successor.rchild = delNode.rchild;
        }
        return successor;
    }

    // 删除一个节点----?删除根节点时会出现错误
    public static boolean delete(BitNode root, int data) {
        BitNode current = root;
        BitNode parent = root;
        boolean isLeftChild = true;

        while (current.data != data) {// search for node
            parent = current;
            if (data < current.data) { // go left?

isLeftChild = true; current = current.lchild; } else { // go right?

isLeftChild = false; current = current.rchild; } if (current == null) { // end of th return false; // didn't find it } } // found node to delete // if no children, simply delete it if (current.lchild == null && current.rchild == null) { if (current == root) {// if root root = null; // tree is empty } else if (isLeftChild) { parent.lchild = null;// disconnect } else { // from parent parent.rchild = null; } } else if (current.rchild == null) {// if no right child replace with // left subtree if (current == root) { root = current.lchild; } else if (isLeftChild) { parent.rchild = current.lchild; } else { parent.rchild = current.lchild; } } else if (current.lchild == null) {// if no left child replace with // right subtree if (current == root) { root = current.rchild; } else if (isLeftChild) { parent.lchild = current.rchild; } else { parent.rchild = current.rchild; } } else {// two chiledren ,so replace with inorde successor //get successor of node to delete(current) BitNode successor = getSuccessor(current); //connect parent of current to successor instead if(current == root){ root = successor; } else if(isLeftChild){ parent.lchild = successor; } else { parent.rchild = successor; } //connect successor to current's left child successor.lchild = current.lchild; } return true; } }
做一门精致,全面详细的 java数据结构算法!!!让天下没有难学的数据结构,让天下没有难学的算法,不吹不黑,我们的讲师及其敬业,可以看到课程视频,课件,代码的录制撰写,都是在深夜,如此用心,其心可鉴,他不掉头发,谁掉头发???总之你知道的,不知道的,我们都讲,并且持续更新,走过路过,不要错过,不敢说是史上最全的课程,怕违反广告法,总而言之,言而总之,这门课你值得拥有,好吃不贵,对于你知识的渴求,我们管够管饱话不多说,牛不多吹,我们要讲的本门课程内容:稀疏数组、单向队列、环形队列、单向链表、双向链表、环形链表、约瑟夫问题、栈、前缀、中缀、后缀表达式、中缀表达式转换为后缀表达式、递归回溯、迷宫问题、八皇后问题、算法的时间复杂度、冒泡排序、选择排序、插入排序、快速排序、归并排序、希尔排序、基数排序(桶排序)、堆排序、排序速度分析、二分查找、插值查找、斐波那契查找、散列、哈希表、二叉树、二叉树数组转换、二叉排序树(BST)、AVL树、线索二叉树、赫夫曼树、赫夫曼编码、多路查找树(B树B+树和B*树)、图、图的DFS算法和BFS、程序员常用10大算法、二分查找算法(非递归)、分治算法、动态规划算法、KMP算法、贪心算法、普里姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法马踏棋盘算法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值