二叉排序树的添加与删除

二叉排序树

  1. 二叉排序树定义:

(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;
(3)左、右子树也分别为二叉排序树;
(4)没有键值相等的结点。

  1. 二叉排序树的查找
private void searchNode(int data){
        if(root == null){
            root = new node();
            root.data = data;
        }else {
            node p = root;
            node xx = new node();
            xx.data = data;
            addNode(xx,p);
        }
    }

    /**
     * 查找,若不存在则插入
     * @param xx 结点
     * @param p 比较的结点
     */
    private void addNode(node xx,node p){
        if(xx.data < p.data){
            if(p.lchild == null){
                xx.lchild = p.lchild;
                p.lchild = xx;
            }else{
                p = p.lchild;
                addNode(xx,p);
            }
        }else if(xx.data > p.data){
            if(p.rchild == null){
                xx.rchild = p.rchild;
                p.rchild = xx;
            }else{
                p = p.rchild;
                addNode(xx,p);
            }
        }
    }
  1. 二叉排序树的删除
/**
     * 删除结点 ,其左右均有结点
     * @param xx 需要删除的结点
     */
    private void deleteNode_1(node xx,node p){
        if(p != null){
            if(root == xx){
                root = null;
                return;
            }else if(p.lchild == xx){
                node a = xx.lchild;
                node b = xx.rchild;
                p.lchild = a;
                while(a.rchild != null){
                    a = a.rchild;
                }
                a.rchild = b;
            }else if(p.rchild == xx){
                node a = xx.lchild;
                node b = xx.rchild;
                p.rchild = a;
                while(a.rchild != null){
                    a = a.rchild;
                }
                a.rchild = b;
            }
            deleteNode_1(xx,p.lchild);
            deleteNode_1(xx,p.rchild);
        }
    }

    /**
     * 删除结点,其左右有一个为空或是都为空
     * @param xx 需要删除的结点
     */
    private void deleteNode_2(node xx,node p){
        if(p != null) {
            if (root == xx) {
                root = null;
                return;
            } else if (p.lchild == xx) {
                if (xx.lchild != null) {
                    p.lchild = xx.lchild;
                } else if (xx.rchild != null) {
                    p.lchild = xx.rchild;
                }else {
                    p.lchild = null;
                }
            } else if (p.rchild == xx) {
                if (xx.lchild != null) {
                    p.rchild = xx.lchild;
                } else if (xx.rchild != null) {
                    p.rchild = xx.rchild;
                }else {
                    p.lchild = null;
                }
            }
            deleteNode_2(xx, p.lchild);
            deleteNode_2(xx, p.rchild);
        }
    }
  1. 判断删除的结点在二叉树中的状态
/**
     *  判断删除结点情况
     */
    private void judge(node p,int data){
        if(p != null){
            if(p.data == data){
                if(p.lchild != null && p.rchild != null){
                    /* allTrue用来保存查询的结果 */
                    allTrue = true;
                }else {
                    allTrue = false;
                }
                /* l为查找的的结点 */
                l =  p;
            }
            judge(p.lchild,data);
            judge(p.rchild,data);
        }
    }

/******************************************** 我是分割线 ****************************************************/

  • 完整代码
import java.util.Scanner;

public class balanceTree {
    private Scanner sc = new Scanner(System.in);
    /* 根节点 */
    private node root;
    /* 判断删除二叉树情况 */
    private boolean allTrue;
    /* 判断是否查找到指定数据 */
    private boolean isSuccess = true;
    /* 寻找删除的结点 */
    private node l;
    public static void main(String[] args) {
        new balanceTree().control();
    }

    private void control(){
        System.out.print("请输入查找的数据:");
        int data = sc.nextInt();
        System.out.print("请输入序列的个数:");
        int num = sc.nextInt();
        while(num-- > 0){
            System.out.print("请输入序列:");
            int dat = sc.nextInt();
            if(dat == data){
                System.out.println("查找成功");
                isSuccess = false;
                break;
            }
            searchNode(dat);
        }
        System.out.println("\n删除前:");
        LDR(root);
        if(isSuccess){
            System.out.println("[ 序列中不存在此数据 ]");
        }
        System.out.print("请输入删除的结点信息:");
        judge(root,sc.nextInt());
        if(l != null) {
            if (allTrue) {
                deleteNode_1(l, root);
            } else {
                deleteNode_2(l, root);
            }
        }
        System.out.println("\n删除后:");
        LDR(root);
    }

    /**
     * 寻找结点
     * @param data 数据
     */
    private void searchNode(int data){
        if(root == null){
            root = new node();
            root.data = data;
        }else {
            node p = root;
            node xx = new node();
            xx.data = data;
            addNode(xx,p);
        }
    }

    /**
     * 查找,若不存在则插入
     * @param xx 结点
     * @param p 比较的结点
     */
    private void addNode(node xx,node p){
        if(xx.data < p.data){
            if(p.lchild == null){
                xx.lchild = p.lchild;
                p.lchild = xx;
            }else{
                p = p.lchild;
                addNode(xx,p);
            }
        }else if(xx.data > p.data){
            if(p.rchild == null){
                xx.rchild = p.rchild;
                p.rchild = xx;
            }else{
                p = p.rchild;
                addNode(xx,p);
            }
        }
    }

    /**
     * 删除结点 ,其左右均有结点
     * @param xx 需要删除的结点
     */
    private void deleteNode_1(node xx,node p){
        if(p != null){
            if(root == xx){
                root = null;
                return;
            }else if(p.lchild == xx){
                node a = xx.lchild;
                node b = xx.rchild;
                p.lchild = a;
                while(a.rchild != null){
                    a = a.rchild;
                }
                a.rchild = b;
            }else if(p.rchild == xx){
                node a = xx.lchild;
                node b = xx.rchild;
                p.rchild = a;
                while(a.rchild != null){
                    a = a.rchild;
                }
                a.rchild = b;
            }
            deleteNode_1(xx,p.lchild);
            deleteNode_1(xx,p.rchild);
        }
    }

    /**
     * 删除结点,其左右有一个为空或是都为空
     * @param xx 需要删除的结点
     */
    private void deleteNode_2(node xx,node p){
        if(p != null) {
            if (root == xx) {
                root = null;
                return;
            } else if (p.lchild == xx) {
                if (xx.lchild != null) {
                    p.lchild = xx.lchild;
                } else if (xx.rchild != null) {
                    p.lchild = xx.rchild;
                }else {
                    p.lchild = null;
                }
            } else if (p.rchild == xx) {
                if (xx.lchild != null) {
                    p.rchild = xx.lchild;
                } else if (xx.rchild != null) {
                    p.rchild = xx.rchild;
                }else {
                    p.lchild = null;
                }
            }
            deleteNode_2(xx, p.lchild);
            deleteNode_2(xx, p.rchild);
        }
    }

    /**
     *  判断删除结点情况
     */
    private void judge(node p,int data){
        if(p != null){
            if(p.data == data){
                if(p.lchild != null && p.rchild != null){
                    allTrue = true;
                }else {
                    allTrue = false;
                }
                l =  p;
            }
            judge(p.lchild,data);
            judge(p.rchild,data);
        }
    }
    
    /**
     * 中序遍历
     * @param xx ...
     */
    private void LDR(node xx){
        if(xx != null){
            LDR(xx.lchild);
            System.out.println("[ data = " + xx.data + " ]");
            LDR(xx.rchild);
        }
    }
}

final class node{
    int data;
    node lchild;
    node rchild;
}
  • 记录,以供复习
    若有不足,多谢指正!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

最向往的地方

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值