二叉排序树或是一棵空树,或者是具有下列性质的二叉树:
- 若左子树不空,则左子树上所有结点的值均小于它根结点的值。
- 若右子树不空,则右子树上所有结点的值均大于或等于它根结点的值。
- 左、右子树也分别为二叉排序树。
- 没有键值相等的节点。
给你的问题是,标准输入一整数表,使用该方法查找一个给定的整数值,查找中是通过使用表中的元素与给定的元素值进行比较完成查找,需要你依次输出在二叉排序树查找结果和查找过程,并输出比较次数,与一个记录的比较仅算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;
}
}