【问题标题】:Java indentation in Level-order Tree print, not binary tree级别顺序树打印中的Java缩进,而不是二叉树
【发布时间】:2017-05-03 21:01:03
【问题描述】:

我想用级别顺序遍历打印我的非二叉树。在下面的代码中,每次添加一组新的孩子时我都会缩进,但是当我再次回到树中时,我需要以某种方式删除缩进。这是这棵树的打印方式:

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

【问题讨论】:

    标签: java tree indentation traversal


    【解决方案1】:

    您需要在开始处理子项时增加缩进量,然后在到达一组子项结束时减少它。

    您最好使用递归调用之类的东西而不是队列来完成整个事情。队列增加了很多复杂性并且没有帮助。

    类似:

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

    您可以在此处进行一些优化(例如只进行一次字符串连接),您需要进行一些整理,但这应该可以为您提供所需的基本框架。

    使用启动它

    recurseTree(root, "");
    

    【讨论】:

    • 谢谢!现在很好用,奇怪的是我在搜索 Java 广度优先算法 xD 时没有找到递归解决方案
    • @SimonAndersson 这是递归的经典用例之一,所以我很惊讶没有出现。
    • 是的,但深度优先更为常见,也许这就是原因
    • 嗯,这确实是深度优先,但这就是您在输出描述中所说的。
    • 哦,那是真的,我猜我现在脑子不太快;)再次感谢
    【解决方案2】:

    您永远不会重置缩进值。 您需要复制它的值,以便在经过一群孩子后恢复它

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

    【讨论】:

    • 第一个 while 循环,它将所有 1 级子级添加到队列中,(主页、文档、下载)。下一个循环它会删除 home 并首先在队列中添加所有 home 子项,我不确定我需要在哪里重置缩进值
    • Tim B 算法是实现您想要实现的目标的最佳选择。
    猜你喜欢
    • 1970-01-01
    • 2012-10-22
    • 2011-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-21
    • 1970-01-01
    相关资源
    最近更新 更多