解题思路:
        思路类似二分查找吧,就是把数据存储形式换成了二叉树,将比父节点小的值插入左子树,比父节点大的值插入右子树,将全部数据插入完成后即可开始查找,比父节点小的值就去左子树上查找,比父节点大的值就去右子树查找,如果查找到叶子节点仍没有查找成功便是查找失败。
注意事项:

        就是插入的时候建立的新节点要与父节点连接上,我是用返回值的方式连接的,c语言可以通过指针间接访问父节点并将父节点的指针域指向新建立的节点。由于我没将二叉查找树转化为二叉平衡树,思路并不复杂,没什么其他的注意事项了。
参考代码:

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int n = scanner.nextInt();
		int k = scanner.nextInt();
		//以输入的第一个值创建根节点root
		Node root = new Node(scanner.nextInt());
		//将剩下的n-1个输入值插入树中
		for (int i = 1; i < n; i++) {
			root = root.put(root, scanner.nextInt());
		}
		//k次循环以查找k个值,查找成功则输出1,查找失败则输出0
		for (int i = 0; i < k; i++) {
			if (root.searchNode(root, scanner.nextInt())) {
				System.out.print("1 ");
			}else {
				System.out.print("0 ");
			}
		}
		System.out.println();
	}
}
//树的节点实现类
class Node{
	public int value;//保存节点的值
	public Node left;//保存节点的左儿子
	public Node right;//保存节点的右儿子

	public Node(int value) {
		this.value = value;
	}
	//插入节点
	public Node put(Node node, int value) {
		//递归的终止条件,因为题中输入的值都是不相等的,故一定会递归到空节点上,此时创建一个节点
		if (node == null) {
			return new Node(value);
		}
		//如果插入的值小于该节点的值,则递归到该节点的左子树上插入
		if(value < node.value) {
			node.left = put(node.left, value);
		}else {//如果插入的值大于该节点的值,则递归到该节点的右子树上插入
			node.right = put(node.right, value);
		}
		//将完成插入操作的节点返回
		return node;
	}
	//查找值
	public boolean searchNode(Node node, int value) {
		//如果节点为空则代表递归到叶子节点仍没有查找成功,故返回false表明查找失败
		if (node == null) {
			return false;
		}
		//如果查找值小于节点值,则递归到左子树查找
		if (value < node.value) {
			return searchNode(node.left, value);
		}else if (value > node.value) {//如果查找值大于节点值,则递归到右子树查找
			return searchNode(node.right, value);
		}else{//如果查找值等于节点值,则查找成功
			return true;
		}
	}
}


点赞(0)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论