给定一颗二叉查找树,给定一个值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

测试结果:

posted on 2014-08-06 21:12  吉大依恋  阅读(426)  评论(0编辑  收藏  举报