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


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

    测试结果:

  • 相关阅读:
    HDU2647(拓扑排序+反向建图)
    Android Activity之间通信
    Swift 编程语言学习0.1——Swift简单介绍
    HDU 5012 Dice (BFS)
    当向后台插入或读取JSON数据遇见回车时
    Android CTS測试Fail项改动总结(四)
    【Unity 3D】学习笔记三十五:游戏实例——摄像机切换镜头
    android蓝牙4.0(BLE)开发之ibeacon初步
    Error opening zip file or JAR manifest missing : D:play-1.2.5/framework/play-1.2.5.jar
    Codeforces Round #256 (Div. 2)——Multiplication Table
  • 原文地址:https://www.cnblogs.com/yanglf/p/3895783.html
Copyright © 2020-2023  润新知