簡體   English   中英

字符串的二叉搜索樹 (BST) 搜索方法

[英]Binary Search Tree (BST) search method for string

我已經構建了一個 BST,它具有以下元素(國家代碼(字符串)、指標代碼(字符串)、指標名稱(字符串)以及年數(整數)和值(字符串)的 ArrayList)。

我試圖弄清楚如何通過輸入指標代碼然后輸出將是值的年份來提示用戶進行搜索。

如果您能展示如何對搜索方法進行編碼,我將不勝感激,因為我已經嘗試了所有方法。

我在 BST 課上試過這個。 但感覺不對(?)

public void search(Indicator indicator, String searchTerm){ 

    String str = (String)indicator.getICode();
    int n1 = str.compareTo(searchTerm);
    int n2 = searchTerm.compareTo(str); 

    if (str == null || str.equalsIgnoreCase(searchTerm)){
        return str; 
    }

    if (n1 > n2){
        return search(indicator, searchTerm); 
    }

    else if (n1 < n2){
        return search(indicator, searchTerm);
    }
} 

這是我的應用程序類:

public class BigDataBST{
    public static void main (String [] Args) throws IOException {
        try{
            BST bigdata = new BST();
            MyData d1;

            File inFile = new File ("Indicator.txt");
            FileReader fr = new FileReader (inFile);
            BufferedReader br = new BufferedReader(fr);
            String str = br.readLine();

            while(str != null ){
                StringTokenizer st = new StringTokenizer(str,";");
                ArrayList <MyData> data = new ArrayList();  

                String cCode = st.nextToken();
                String iName = st.nextToken();
                String iCode = st.nextToken();

                for (int j = 0; j < 59; j++){ 
                        String v = st.nextToken();
                        int year = 1960 + j;

                        d1 = new MyData (year,v);
                        data.add(d1);
                }
                Indicator idct = new Indicator (cCode,iName,iCode,data);
                bigdata.insertNode(idct);

                str = br.readLine();
            }

樹節點類:

    TreeNode left;
    TreeNode right;
    Indicator idct;

    public TreeNode(Indicator id){
        left = right = null;
        idct = id;
    }

指標類:

    private String cCode;   //country code
    private String iName;   //indicator Name;
    private String iCode;       //indicator code;
    public ArrayList <MyData> DataList;

    public Indicator(){
        cCode = null;
        iName = null;
        iCode = null;
        DataList = null;
    }

    public Indicator(String cCode, String iName, String iCode,ArrayList <MyData> DataList){
        this.cCode = cCode; 
        this.iName = iName;
        this.iCode = iCode;
        this.DataList = DataList;
    }

    //setter & getter method for attributes iCode,iName and cCode
    //toString method

MyData 類:

    private int year;
    private String value;

    public MyData(){
        year = 0;
        value = null;
    }

    public MyData(int year, String value){
        this.year = year;
        this.value = value;
    }

    //setter & getter method for attributes year and value
    //toString method

indicator.txt 的示例:
(從左起:cCode;iName;iCode;值)
我的; 工業就業(占總就業的百分比)(模擬國際勞工組織估計); SL.IND.EMPL.ZS;

29,08600044;28,56900024;28,36300087;28,02300072;27,51600075;27,48699951;27,39800072;27,30500031

我想你不知道如何在Binary Search Tree 您可以通過訪問每個節點來執行此操作,並且可以使用遞歸來執行此操作。

在您的search()您將Indicator作為參數,但實際上您需要使用TreeNode因為每個節點都有一個您可以訪問的Indicator類型的數據。

在您的search()您使用相同的參數一次又一次地調用search() ,這些參數永遠不會給您結果。 此外,您沒有基本案例。 這不是遞歸的工作方式。 你會得到一個stackoverflowException (哈哈,這很有趣,因為我們在 StackOverFlow 上)。 請改用此代碼:

public void search(string key)
{
    searchHelper(key, root);  // root node will be in Tree.java
}

public void searchHelper(string key, TreeNode current)
{
    if(current == null)
    {
        System.out.println("\nCant find !");
        return;
    }
    if(key.compareTo(current.idct.getICode()) < 0 )
        searchHelper(key, current.left);
    else if(key.compareTo(current.idct.getICode()) > 0)
        searchHelper(key,current.right);
    else
        System.out.println("\n"+current.idct + "Found \n");
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM