2011-05-22 135 views
0

我需要幫助實現基於二叉樹的文本形式的簡單網站結構 - 每個新的「頁面」都有一個父節點和兩個子節點。從家庭開始,設計是將第一個「頁面」添加到左側節點,然後將以家爲父節點的後續頁面添加到該節點的右側節點,所有這些也都鏈接到家庭作爲父節點。子類別相同 - 即添加一個父母「商店」的頁面應向左搜索,直到它找到商店頁面,然後添加到左側,如果其第一個從該節點添加到相同父級的後續頁面的權利。插入/添加二叉樹的方法

下面是目前爲節點,網站和頁面類的代碼。我很確定我的問題在於addpage方法的非遞歸方法,因爲到目前爲止,代碼產生了一個帶有兩個子節點的商店主頁,但所有其他節點都是空的。此外雷爾消息應該被添加到商店,而不是青梅正確的節點,但我有點難倒就如何做到這一點....

public class Site 
{ 

public class PageNode 
{ 

    private Page page; 
    private PageNode firstchild; 
    private PageNode parent; 
    private PageNode nextsibling; 

public PageNode() 
{ 
    this.firstchild = null; 
    this.parent = null; 
    this.nextsibling = null; 
} 

public PageNode(String PageName) 
{ 
    this.firstchild = null; 
    this.parent = null; 
    this.nextsibling = null; 
} 

public String toString() 
{ 
    return ""+page; 
} 

} 
private PageNode currentPage; 
private PageNode homePage; 

public Site() 
{ 
    this.homePage=new PageNode(); 
    this.homePage.page=new Page("Home"); 
    this.currentPage=this.homePage; 

    PageNode shops=addPage("Shops",this.homePage); 
    addPage("News",this.homePage); 
    PageNode products=addPage("Products",this.homePage); 

    addPage("Paisley",shops); 
    addPage("Hamilton",shops); 

    PageNode kitchen=addPage("Kitchen",products); 
    addPage("Bedroom",products); 

    addPage("Kettles",kitchen); 
    addPage("Cookers",kitchen); 
    addPage("Toasters",kitchen); 
} 

public PageNode addPage(String PageName) 
{ 
      this.currentPage=new PageNode(); 
      this.currentPage.page=new Page(PageName); 

    PageNode ParentNode=new PageNode(); 
    ParentNode.page=currentPage.page; 
    if (this.homePage==null) 
     this.homePage=ParentNode; 
    else 
     ParentNode=this.addPage(PageName,ParentNode); 
    return ParentNode; 
} 
private PageNode addPage(String PageName, PageNode ParentNode) 
{ 
      ParentNode = new PageNode(); 
      ParentNode.page=new Page(PageName); 

    if (this.currentPage.page.compareTo(ParentNode.page)==0) 
    { 
     System.out.println("attempt to insert a duplicate"); 
    } 
    else 
        if (ParentNode.page.compareTo(currentPage.page)<0) 

         if(currentPage.firstchild == null) 
         { 
      currentPage.firstchild=ParentNode; 
          ParentNode.firstchild = new PageNode(); 
          ParentNode.firstchild.page = new Page(PageName); 
         } 
          else if(currentPage.nextsibling == null) 
          { 
           currentPage.nextsibling=ParentNode;       
           ParentNode.nextsibling = new PageNode(); 
           ParentNode.nextsibling.page = new Page(PageName); 
          } 
      return ParentNode; 
} 

public void displayCurrentPage() 
{ 
       if (this.homePage!=null) 
    { 
     this.displayBranches(this.homePage); 
    } 
    else 
     System.out.println("tree is empty"); 
    } 
    private void displayBranches(PageNode ParentNode) 
    { 
    if (ParentNode!=null) 
    { 
     System.out.println(ParentNode.page+" "); 
     System.out.print(" left: "); 
     if (ParentNode.firstchild!=null) 
      System.out.println(ParentNode.firstchild.page); 
     else 
      System.out.println("null"); 
     System.out.print(" right: "); 
     if (ParentNode.nextsibling!=null) 
      System.out.println(ParentNode.nextsibling.page); 
     else 
      System.out.println("null"); 
        displayBranches(ParentNode.firstchild); 
     displayBranches(ParentNode.nextsibling); 
    } 
} 

和頁面類

public class Page implements Comparable 
{ 
private String page; 

public Page (String PageName) 
{ 
    page = PageName; 
} 

public String getPage() 
{ 
    return page; 
} 

public int compareTo(Object otherObject) 
{ 
int result=((Page)otherObject).page.compareTo(this.page); 
return result; 
} 
public String toString() 
{ 
    return ""+page; 
} 
} 

請注意 - public site()由教師實施,因此其餘部分需要符合其中的addpage調用。

+0

什麼是* *問題,這在這裏會更清楚了嗎? – 2011-05-22 14:28:55

+0

對於如何修改我的addpage方法來正確添加10個頁面,我很難過。我已經嘗試了很多permuations,但是這是我得到的最好的,沒有崩潰或從一個無限遞歸堆棧stackioverflow :(只是一個可能需要改變的指標將是一個幫助。謝謝。 – Matt 2011-05-22 14:32:50

+0

我剛剛發現,基本上被要求實施這個作爲一個左兒童 - 右兄弟樹(不是教師認爲它有用說這個,但嘿)... – Matt 2011-05-22 16:58:07

回答

0

,你會想要一個目錄樹不是一個二叉搜索樹

,如果你組織你的節點像這樣

public class PageNode 
{ 
    private Page page; 
    private PageNode child; 
    private PageNode parent; 
    private PageNode nextSibling; 

    //... 
} 
+0

我看到了重命名節點將如何幫助清晰 - 但我認爲給出了什麼我已經看到目錄樹結構(雖然案例研究類似)我認爲這背後的想法是實現它作爲一個二叉樹模仿目錄樹... – Matt 2011-05-22 15:22:46

+0

比較功能,然後必須修改爲返回-1爲當前節點的後代和+1爲兄弟的後代 – 2011-05-22 15:25:25

+0

我猜我需要比較「父」值?但是你如何在Page類中做到這一點?我應該在PageNode中重寫compareto嗎? – Matt 2011-05-22 16:05:53