5、二叉排序树的查找

二叉排序树或是一棵空树,或者是具有下列性质的二叉树:

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

  给你的问题是,标准输入一整数表,使用该方法查找一个给定的整数值,查找中是通过使用表中的元素与给定的元素值进行比较完成查找,需要你依次输出在二叉排序树查找结果和查找过程,并输出比较次数,与一个记录的比较仅算1次。

输入: 标准输入,输入的第一行为两个正整数n,key,n表示需要查找表的元素个数,key表示需要完成查找的关键字;第二行为n个整数,两数之间为一个空格隔开,并没有相同的两个数。

输出: 标准输出,第一行依次输出在查找过程中进行比较的元素值,两数之间使用一个空格隔开。输出的第二行输出查找结果,如果查找成功,输出“YES”,如果查找元素不在表中,输出“NO"。输出的第三行为本次查找过程中比较的总次数。

输入样例:
11 80
70 30 40 10 80 20 90 100 75 60 45
输出样例:
70 80
true
2

// 仅供参考

import java.util.ArrayList;
import java.util.Scanner;

class Main{
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int key = sc.nextInt();
        LinkBiTree lb = new LinkBiTree();
        for (int i = 0; i < n; ++i) {
            int num = sc.nextInt();
            lb.insert(num);
        }
        boolean flag = lb.search(key);
        ArrayList list = lb.getList();
        for (int i = 0; i < list.size(); i++) {
            if (i > 0) System.out.print(" ");
            System.out.print(list.get(i));
        }
        System.out.println();
        System.out.println(flag);
        System.out.println(list.size());
    }

}

class LinkBiTree{
    // 定义一个结点类
    private static class Node{
        int data;
        Node lchild;
        Node rchild;

        public Node(int data, Node lchild, Node rchild) {
            this.data = data;
            this.lchild = lchild;
            this.rchild = rchild;
        }

        public Node(int data) {
            this(data, null, null);
        }
    }

    public LinkBiTree() {
        head = null;
        list = new ArrayList<>();
    }

    private Node head;
    private ArrayList list;

    ArrayList getList() {
        return list;
    }
    
    // 利用递归二叉树加入结点
    void insert(int data) {
        head = insert(data, head);
    }

    private Node insert(int data, Node p) {
        if (p == null) {
            return new Node(data);
        } else if (data > p.data) {
            p.rchild = insert(data, p.rchild);
        } else if (data < p.data) {
            p.lchild = insert(data, p.lchild);
        }
        return p;
    }

    // 利用递归查找元素
    boolean search(int data) {
        return search(data, head);
    }

    private boolean search(int data, Node p) {
        if (p == null)
            return false;
        list.add(p.data);
        if (data < p.data) {
            return search(data, p.lchild);
        } else if (data > p.data) {
            return search(data, p.rchild);
        }
        return true;
    }
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

qing影

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

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

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

打赏作者

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

抵扣说明:

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

余额充值