2015-10-06 89 views
0

我想弄清楚如何打印第一個孩子下一個兄弟姐妹樹。我想是這樣的:如何打印第一個孩子 - 兄弟姐妹結構

root 
| 
firstChild - sibling - sibling 
         | 
         child - sibling - sibling 

我有下面的代碼添加孩子的兄弟姐妹:

class Program 
{ 
    static void Main(string[] args) 
    { 
     GeneralTree<string> tree = new GeneralTree<string>(); 
     tree.root = new TreeNode<string> 
     { 
      Data = "Root" 
     }; 
     TreeNode<string> child = tree.addChild(tree.root, "Child"); 
     tree.addSibling(child, "Sibling"); 
     tree.print(tree.root); 
    } 
} 
class GeneralTree<T> 
{ 
    public TreeNode<T> root; 

    public TreeNode<T> addChild(TreeNode<T> parent, T data) 
    { 
     parent.FirstChild = new TreeNode<T> 
     { 
      Data = data, 
      NextSibling = parent.FirstChild 
     }; 
     return parent.FirstChild; 
    } 
    public TreeNode<T> addSibling(TreeNode<T> sibling, T data) 
    { 
     sibling.NextSibling = new TreeNode<T> 
     { 
      Data = data, 
      FirstChild = sibling.NextSibling 
     }; 
     return sibling.NextSibling; 
    } 

    int count = 0; 
    public void print(TreeNode<T> Node) 
    { 

     if(Node !=null) 
     { 
      Console.WriteLine(Node.Data); 
      print(Node.FirstChild); 
      ++count; 
      Console.WriteLine(count); 
      print(Node.NextSibling); 
     } 
    } 
} 
class TreeNode<T> 
{ 
    public T Data { get; set; } 
    public TreeNode<T> FirstChild { get; set; } 
    public TreeNode<T> NextSibling { get; set; } 
} 

現在有沒有人如何打印出來?

在此先感謝!

+0

只是一個小例子如何打印一棵樹 – theMaster

+0

我在上面描述了它如何打印出來 – theMaster

+0

我的不好,我沒有仔細閱讀,對不起(刪除我的評論)。 – Amessihel

回答

0

我選用合併TreeNodeGeneralTree這樣:

public class TreeNode<T> 
{ 

    public T data; 
    public List<TreeNode<T>> childs; 

    public TreeNode<T> firstChild() 
    {return childs.get(0);} 

    public void appendChild(TreeNode<T> child) 
    {childs.add(child);} 

    public void print() {/* ... */} 

    /* ... */ 

    public static void main(String args[]) 
    { /* ... */} 
} 

然後,方法寫print()遞歸:

public void print() 
    { 
     print(0);  
    } 

    public void print(int offset) 
    { 
     if (node == null) return; // nothing to print anymore 

     System.out.println(this.data); // printing the root data 

     TreeNode<T> lastChild=null; 
     String output = ""; 
     for(Iterator<TreeNode<T>> i = childs.iterator(); i.hasNext();) 
     { 
      lastChild = i.next(); 
      if (output != "") output += " - "; 
      output += lastChild.data; 
     } 

     // length will be the next line offset 
     // (size of the current line output minus last item length 

     int length = output.length()-lastChild.toString().length; 
     // use a repeat() string function like this one : 
     output = org.apache.commons.lang.StringUtils.repeat(" ", length) + (length>0?"|":"") + output; 
     System.out.println (output); 
     lastChild.print(length); 
    } 

} 

不幸的是我無法驗證我的代碼現在,如果你有問題,請讓我知道。

+0

爲了記錄,我使用C#編碼。我認爲我的代碼在結構上是正確的,但我想知道的下一件事是如何像第一個孩子下一個兄弟樹一樣打印它。如果我打印tree.root.FirstChild.NextSibling.Data我得到正確的兄弟姐妹,所以我認爲代碼不是問題,只有如何打印出來的方式 – theMaster

+0

是的,你只需要檢查打印循環。我的理解是,你想打印所有的兄弟姐妹,然後**最後兄弟姐妹的孩子。對?如果你理解過程'(next offset = length(current_line) - length(lastSibling))',你應該可以編寫你自己的函數。 – Amessihel

+0

但在你的情況下,每個節點可能有2個以上的節點,因爲你使用一個列表來存儲它的所有孩子。這不是如何構建二叉樹。 – theMaster