2017-05-03 71 views
0

我想打印具有级别顺序遍历的非二叉树。在下面的代码中,每次添加一组新的子元素时,都会缩进,但当我再次返回树时,我需要删除缩进。以下是这棵树打印:级别顺序中的Java缩进树打印,而不是二叉树

Root 
    Home 
    HomeChild1 
    HomeChild2 
    Documents (should be same level as Home) 
     DocumentChild1 
     DocumentChild2 
     Downloads (should be same level as Home and Documents) 
     DownloadsChild1 

代码:

queue.add(o); //root 
     int indent = 0; 
     while(!queue.isEmpty(){ 

      for(int i=0; i<indent; i++){ 
       print(" "); 
      } 

      Object tempObj = queue.remove(o); 
      print(tempObj.value); 

      if(tempObj.children != null){ 
       //Adding all childrens, since its not a binary tree I loop throught all children 
       for(int i=0; i<tempObj.children.length; i++){ 
        queue.add(0, tempObj.children[i]; 
       } 
       indent++; 
      } 
     } 

这是我希望它看起来像

Root 
    Home 
    HomeChild1 
    HomeChild2 
    Documents 
    DocumentChild1 
    DocumentChild2 
    Downloads 
    DownloadsChild1 

回答

1

您需要在开始处理子项时递增缩进,然后在到达一组子项的末尾时递减缩进。

你会更好地使用类似递归调用而不是队列来做这件事。队列增加了很多复杂性,并没有帮助。

喜欢的东西:

recurseTree(Thing obj, String indent) { 
    print(indent+obj.value); 
    if (obj.children != null) { 
     for (Thing child: obj.children) { 
      recurseTree(child, indent+" "); 
     } 
    } 
} 

你可以做一些优化技术在这里(例如,仅做字符串concatonation一次),你将需要做一些整理,但应该给你的基本框架,你需要。

使用

recurseTree(root, ""); 
+0

谢谢!现在工作很好,很奇怪我在搜索Java广度优先算法时找不到递归解决方案xD –

+0

@SimonAndersson这是递归的经典用例之一,所以我很惊讶没有出现。 –

+0

是的,但深度优先更常见,也许这就是为什么 –

0

你永远不会重置您的缩进值。 你需要复制它的值,这样你可以在你通过一群孩子后恢复它

顺便说一句,如果你尝试一些递归它更容易处理。

+0

首先while循环,它增加了所有级别1的孩子到队列中,(家里,文档,下载)启动它。然后下一个循环它将首先删除家庭并添加所有家庭儿童,我不知道我需要重新设置缩进值的位置。 –

+0

Tim B算法只是最好的做你想做的事情。 – rilent