构建和顺序遍历树:> 2个儿子

时间:2013-05-11 20:03:44

标签: java ms-access tree ordered-tree

我需要从Access数据库中读入成员列表。每个成员都由另一名成员赞助。每条记录都包含其赞助商的ID和他们自己的ID。我现在必须能够有效地阅读会员名单并打印出来,以显示由谁赞助的人。

我觉得最有效的方法是构建一个树然后进行顺序遍历。

我的输出应该是这样的:

 Mary Jones
     Kim Smith
     Rena Brown
      Joan Brown
        Patsy Brown
     Howard Sharp
     Ken Johnson
 Peter Pan
     Wendy
     Hook
 Davey Crocket
     …

订单将按身份证号码。我发现的一切都是二元树,只有左右儿子。如你所见,这对我不起作用。

首选解决方案是Java,但我会非常感激。

邦尼

1 个答案:

答案 0 :(得分:0)

这就是我想出的。它定义了一个名为ListSponsoredMembers的函数,并以递归方式调用它来构建列表:

import java.sql.*;

public class ListSponsorship {
    static Connection conn;

    public static void main(String[] args) {
        try {
            conn = DriverManager.getConnection(
                    "jdbc:ucanaccess://C:/Users/Public/Database1.accdb;");
            PreparedStatement ps1 = conn.prepareStatement(
                    "SELECT memberID, memberName FROM Members " +
                    "WHERE sponsorID IS NULL ORDER BY memberID");
            ResultSet rs = ps1.executeQuery();
            while (rs.next()) {
                ListSponsoredMembers(rs.getInt("memberID"), rs.getString("memberName"), 0);
            }
            ps1.close();
            conn.close();
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

    private static void ListSponsoredMembers(Integer memberID, String memberName, Integer recursionLevel) {
        for (Integer i = 0; i < recursionLevel; i++) {
            System.out.print("  ");
        }
        System.out.println(memberName);
        try {
            PreparedStatement ps2 = conn.prepareStatement(
                    "SELECT memberID, memberName FROM Members " +
                    "WHERE sponsorID=? ORDER BY memberID");
            ps2.setInt(1, memberID);
            ResultSet rs = ps2.executeQuery();
            Integer newRecursionLevel = ++recursionLevel;
            while (rs.next()) {
                ListSponsoredMembers(rs.getInt("memberID"), rs.getString("memberName"), newRecursionLevel);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

}

对于看起来像这样的[Members]表...

memberID  memberName     sponsorID
--------  -------------  ---------
       1  Mary Jones              
       2  Kim Smith              1
       3  Rena Brown             1
       4  Joan Brown             3
       5  Patsy Brown            4
       6  Howard Sharp           1
       7  Ken Johnson            1
       8  Peter Pan               
       9  Wendy                  8
      10  Hook                   8
      11  Davey Crocket           

...它产生以下输出:

Mary Jones
  Kim Smith
  Rena Brown
    Joan Brown
      Patsy Brown
  Howard Sharp
  Ken Johnson
Peter Pan
  Wendy
  Hook
Davey Crocket