在二叉查找树中查找不小于某个值的最小数值

给定一颗二叉查找树,给定一个值value,求该二叉查找树中不小于某个值value的最小数值。

思考:二叉查找树的特征就是左子节点比父节点值小,右子节点比父节点值大。在获得该二叉查找树根节点的情况下,想要得到该二叉查找树中不小于某个值得最小数值,分以下几点考虑:

1.如果currentNode.getData() == value , 则currentNode节点即为所求节点。

2.如果currentNode.getData() < value , 则当前节点的左子树所有节点的值均小于value, 所

以不需要在左子树中考虑,将搜索范围缩小在右子树中查找。

3.如果currentNode.getData() > value , 则将搜索范围缩小在当前节点和其左子树中查找。更细点讲,如果当前节点的左子树中最大节点值小于value,那么当前节点即为所求,如果当前节点的左子树中最大节点值不小于value,那么将搜索范围缩小在左子树中。

所以,我们采用递归来实现。

节点类:

public class Node {
	int data;
	Node left;
	Node right;
	public Node(){}
	public Node(int data)
	{
		this.data=data;
		left=null;
		right=null;
	}
	public int getData() {
		return data;
	}
	public void setData(int data) {
		this.data = data;
	}
	public Node getLeft() {
		return left;
	}
	public void setLeft(Node left) {
		this.left = left;
	}
	public Node getRight() {
		return right;
	}
	public void setRight(Node right) {
		this.right = right;
	}

}

  搜索树类:

public class SearchTree {
	Node root;

	public Node createTree()
    {
		Scanner scan=new Scanner(System.in);

		int number=scan.nextInt();
		if(number==0)
		{
			return null;
		}
		Node node=new Node(number);

		node.setLeft(createTree());
		node.setRight(createTree());

		root=node;
		return node;
    }

	public Node findTree(Node root, int value)
	{
		if(root==null)
		{
			return null;
		}
		Node iter=root;
		if(iter.data<value)
		{
			return findTree(iter.right,value);
		}
		else if(iter.data==value)
		{
			return iter;
		}
		else if(iter.data>value)
		{
			if(iter.left!=null)
			{
				int leftTreeMax=maxNode(iter.left);
				if(leftTreeMax>=value)
				{
					return findTree(iter.left,value);
				}
				else
				{
					return iter;
				}
			}
			else
			{
				return iter;
			}
		}
		return null;
	}

	public int maxNode(Node root)
	{
		Node iter=root;
		if(iter!=null)
		{
			while(iter!=null && iter.right!=null)
			{
				iter=iter.right;
			}
			return iter.getData();
		}
		else
		{
			return 0;
		}
	}

	public Node getRoot() {
		return root;
	}

	public void setRoot() {
		this.root = createTree();
	}

}

  测试类:

public class Test {
	public static void main(String [] args)
	{
		SearchTree searchTree=new SearchTree();
		Node root=searchTree.createTree();
		//System.out.println("success");
		int value=98;
		System.out.println(">="+value+":  "+searchTree.findTree(root, value).getData());

		value=99;
		System.out.println(">="+value+":  "+searchTree.findTree(root, value).getData());

		value=106;
		System.out.println(">="+value+":  "+searchTree.findTree(root, value).getData());

		value=108;
		System.out.println(">="+value+":  "+searchTree.findTree(root, value).getData());

	    value=115;
		System.out.println(">="+value+":  "+searchTree.findTree(root, value).getData());
	}
}

输入:100 90 70 60 0 0 85 0 0 95 92 0 0 98 0 0 110 105 0 107 0 0 125 0 0

测试结果:

在二叉查找树中查找不小于某个值的最小数值,布布扣,bubuko.com

时间: 2024-10-05 04:58:43

在二叉查找树中查找不小于某个值的最小数值的相关文章

LeetCode 501. Find Mode in Binary Search Tree(寻找二叉查找树中出现次数最多的值)

题意:寻找二叉查找树中出现次数最多的值 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: int ma = 0; int cnt = 1; TreeNode

LeetCode 530. Minimum Absolute Difference in BST(在二叉查找树中查找两个节点之差的最小绝对值)

题意:在二叉查找树中查找两个节点之差的最小绝对值 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: int ans = 0x3f3f3f3f; TreeNo

多个有序数列中查找第k小值

问题描述:现有n个有序序列如(2,3,9),(3,5,11,23),(1,4,7,9,15,17,20),(8,15,35,9),(20,30,40),请求出第k小值. 问题分析:可用多路归并排序将所有序列进行排序后取第k个值,但是只要求求出第k小值将所有数组排序未免显得有点浪费,所以我们可以使用包含k个元素的堆完成,对于每组元素取出前k小的,依次进行比较,得到总的前k小 执行步骤: 一.建初堆:从第一组数中取出前k小的元素建初始大根堆(若不足k个则取全部元素), 二. 1 .补充堆:若堆中元素

微软算法100题04 二叉树中查找和为某值的所有路径

4.在二元树中找出和为某一值的所有路径题目:输入一个整数和一棵二元树.从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径.打印出和与输入整数相等的所有路径.例如输入整数22 和如下二元树10/ \5 12/ \4 7则打印出两条路径:10, 12 和10, 5, 7 思路: 递归 为了记录路径 需要采用一个辅助数据结构记录正确路径上的节点 这里采用list 1. 从根节点开始 将根节点放入List 将总额sum减去根节点的值 如果等于零 说明找到正确路径上的节点 则打印list 2

用array_search 数组中查找是否存在这个 值

#判读里面是否还有id=1的超级管理员 $key=array_search(1, $ids); #判读这个是否存在 if($key!==FALSE){ #如果存在就unset掉这个 unset($ids[$key]); }

java中一个Map要找到值Value最小的那个元素的方法

import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.Set; public class MinMapDemo {     public static void main(String[] args) {         Map<Integer, Integer> map = new HashMap<Int

求解二叉查找树中的最低公共祖先结点

一,问题描述 请构造一棵二叉查找树,并给定两个结点,请找出这两个结点的最低公共祖先结点. 这里假设二叉查找树中的结点的权值存储是整型数字(见代码中的BinaryNode内部类),最低公共祖先结点如下:结点5 和 结点12 的最低公共祖先结点是结点10 二,实现思路 假设给定的两个结点的权值分别为 node1 和 node2 如果根的权值处于 node1 和 node2 之间,则根就是它们的最低公共祖先结点 如果根的权值比 node1 和 node2 都大,则它们的最低公共祖先结点在根的左子树中

程序员面试题目总结--数组(三)【旋转数组的最小数字、旋转数组中查找指定数、两个排序数组所有元素中间值、数组中重复次数最多的数、数组中出现次数超过一半的数】

转!http://blog.csdn.net/dabusideqiang/article/details/38271661 11.求旋转数组的最小数字 题目:输入一个排好序的数组的一个旋转,输出旋转数组的最小元素. 分析:数组的旋转:把一个数组最开始的若干个元素搬到数组的末尾.例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1.这道题最直观的解法并不难.从头到尾遍历数组一次,就能找出最小的元素,时间复杂度显然是O(N).但这个思路没有利用输入数组

#有如下值集合[11,22,33,44,55,66,77,88,99,90...],将所有大于66值保存至字典的一个key中,将小于66的值保存至大二个key的值

1 #!/usr/bin/env python 2 #有如下值集合[11,22,33,44,55,66,77,88,99,90...],将所有大于66值保存至字典的一个key中,将小于66的值保存至大二个key的值 3 4 li = [11,22,33,44,55,66,77,88,99,90] 5 person = {">66":[],"<=66":[]} 6 for i,j in enumerate(li,0) : 7 8 if int(j) >