二叉查找树,删除,节点开始查找数字

本文介绍了一个二叉查找树的Java实现,包括创建、插入、删除节点及遍历等功能。通过具体示例展示了如何使用该类进行操作,并提供了完整的源代码。

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

package com.sjh.dongnaowork.tree;

public class SearchBinaryTree {

TirNode<Integer> root;

/**
 * @param args
 */
public static void main(String[] args) {
    int[] arrays={54,18,66,87,36,12,54,81,15,76,57,6,40,99,85,99};
    SearchBinaryTree searchBinaryTree=new SearchBinaryTree();
    searchBinaryTree.createSearchBinaryTree(arrays);
    searchBinaryTree.preOrderTraverse(searchBinaryTree.root);
    System.out.println("");
    searchBinaryTree.inOrderTraverse(searchBinaryTree.root);
    System.out.println("");
    searchBinaryTree.deleteNode(66);
    System.out.println("删除后的中根:");
    searchBinaryTree.inOrderTraverse(searchBinaryTree.root);
}


//创建一个二叉查找树

public void createSearchBinaryTree(int[] list){



    TirNode<Integer> node;
    for(int i:list){
        node = new TirNode<Integer>(i);
        insterNode(root, node);
    }
}

/**
 * 插入一个数
 * @param p  插入的根节点
 * @param node  需要插入的节点
 */
public void insterNode(TirNode<Integer> p,TirNode<Integer> node){
    if (root==null) {
        root=node;
        return;
    }
    if(node.data==p.data){
        return;
    }
    if(node.data<p.data){   //小于节点
        if(p.leftChild!=null){
            insterNode(p.leftChild, node);
        }else{
            p.leftChild=node;
            node.parent=p;
        }
    }else{
        if(p.rightChild!=null){
            insterNode(p.rightChild, node);
        }else{
            p.rightChild=node;
            node.parent=p;
        }
    }
}

/**
 * 删除某个数
 * @param p
 * @param node
 * @return
 */
public void deleteNode(int i){

    TirNode<Integer> node=searchNode(root,i);
    if(node==null){
        System.out.println("没有这个数据");
    }else{
        System.out.println("删除数据:"+node.data);
        deleteNode(node);
    }
}

/**
 * 删除结点
 * @param node
 */
private void deleteNode(TirNode<Integer> node) {
    if(node==null){
        return;
    }
    if(node.leftChild==null&&node.rightChild==null){   //无左右孩子
        if(node.parent.leftChild==node){
            node.parent.leftChild=null;
        }else if(node.parent.rightChild==node){
            node.parent.rightChild=null;
        }
        node=null;
    }
    else if(node.leftChild==null){      //无左孩子
        if(node.parent.leftChild==node){
            node.parent.leftChild=node.rightChild;
        }else if(node.parent.rightChild==node){
            node.parent.rightChild=node.rightChild;
        }
        node=null;
    }else if(node.rightChild==null){   //无右孩子
        if(node.parent.leftChild==node){
            node.parent.leftChild=node.leftChild;
        }else if(node.parent.rightChild==node){
            node.parent.rightChild=node.leftChild;
        }
        node=null;
    }else{    //有左右孩子
        TirNode<Integer> next=getNextNode(node.rightChild);
        int temp=next.data;
        deleteNode(next);
        node.data=temp;
        System.err.println("后继节点:"+temp);
    }
}



/**
 * 获取后继节点
 * @param node
 * @return
 */
private TirNode<Integer> getNextNode(TirNode<Integer> node) {
    if(node.leftChild==null){
        return node;
    }
    return getNextNode(node.leftChild);
}





/**
 * 从某个节点开始查找数字
 * @param p
 * @param i
 * @return
 */
private TirNode<Integer> searchNode(TirNode<Integer> p,int i) {
    //System.err.println(p.data);
    if(p==null){
        return null;
    }
    if(p.data==i){
        return p;
    }else if(i<p.data){
        return searchNode(p.leftChild, i);
    }else{
        return searchNode(p.rightChild, i);
    }
}


/**
 * 先根遍历(迭代的形式)
 * 
 * @param node
 */
public void preOrderTraverse(TirNode<Integer> node) {
    if (node == null) {
        return;
    }
    System.out.print(node.data+",");
    preOrderTraverse(node.leftChild);
    preOrderTraverse(node.rightChild);
}



/**
 * 中根遍历(迭代的形式)
 * 
 * @param node
 */
public void inOrderTraverse(TirNode<Integer> node) {
    if (node == null) {
        return;
    }
    inOrderTraverse(node.leftChild);
    System.out.print(node.data+",");
    inOrderTraverse(node.rightChild);
}



public class TirNode<T> {
    public T data;
    public TirNode<T> leftChild;
    public TirNode<T> rightChild;
    public TirNode<T> parent;
    public int level;

    public TirNode(T data) {
        this.data=data;
    }
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值