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