首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java使用特定格式的级别顺序打印二叉树

Java使用特定格式的级别顺序打印二叉树
EN

Stack Overflow用户
提问于 2010-02-11 08:54:47
回答 18查看 71.3K关注 0票数 17

好吧,我已经通读了所有其他相关的问题,但找不到一个对java有帮助的问题。我从我能用其他语言破译的东西中得到了大致的想法;但我还没有弄明白。

问题:我想要进行级别排序(我使用递归进行排序),并将其打印成树的一般形状。

因此,假设我有以下内容:

    1 
   / \
  2   3
 /   / \
4   5   6

我的代码输出的级别顺序如下:

1 2 3 4 5 6

我想像这样打印出来:

1
2 3
4 5 6

现在在你给我做关于工作的道德演讲之前。我已经完成了我的AP Comp Sci项目,当我的老师提到广度优先搜索时,我对此感到好奇。

我不知道它是否会有帮助,但到目前为止我的代码如下:

/**
  * Calls the levelOrder helper method and prints out in levelOrder.
  */
 public void levelOrder()
 {
  q = new QueueList();
  treeHeight = height();
  levelOrder(myRoot, q, myLevel);
 }

 /**
  * Helper method that uses recursion to print out the tree in 
  * levelOrder
  */
 private void levelOrder(TreeNode root, QueueList q, int curLev)
 {
  System.out.print(curLev);
  if(root == null)
  {
   return;
  }

  if(q.isEmpty())
  {
   System.out.println(root.getValue());
  }
  else
  {
   System.out.print((String)q.dequeue()+", ");
  }

  if(root.getLeft() != null)
  {
   q.enqueue(root.getLeft().getValue());
   System.out.println();
  }
  if(root.getRight() != null)
  {
   q.enqueue(root.getRight().getValue());
   System.out.println();
   curLev++;
  }

  levelOrder(root.getLeft(),q, curLev);
  levelOrder(root.getRight(),q, curLev);
 }

据我所知,我将需要使用树的总高度,并使用水平计数器…唯一的问题是,当我的levelOrder使用递归遍历树时,我的级别计数器仍在计数。

抱歉,如果这是太多,但一些提示将是很好的。:)

EN

回答 18

Stack Overflow用户

发布于 2012-09-19 16:50:28

这是代码,这个问题是在一次面试中问到我的…

public void printTree(TreeNode tmpRoot) {

        Queue<TreeNode> currentLevel = new LinkedList<TreeNode>();
        Queue<TreeNode> nextLevel = new LinkedList<TreeNode>();

        currentLevel.add(tmpRoot);

        while (!currentLevel.isEmpty()) {
            Iterator<TreeNode> iter = currentLevel.iterator();
            while (iter.hasNext()) {
                TreeNode currentNode = iter.next();
                if (currentNode.left != null) {
                    nextLevel.add(currentNode.left);
                }
                if (currentNode.right != null) {
                    nextLevel.add(currentNode.right);
                }
                System.out.print(currentNode.value + " ");
            }
            System.out.println();
            currentLevel = nextLevel;
            nextLevel = new LinkedList<TreeNode>();

        }

    }
票数 29
EN

Stack Overflow用户

发布于 2012-12-07 23:39:56

这是最简单的解决方案

public void byLevel(Node root){
     Queue<Node> level  = new LinkedList<>();
     level.add(root);
     while(!level.isEmpty()){
         Node node = level.poll();
         System.out.print(node.item + " ");
         if(node.leftChild!= null)
         level.add(node.leftChild);
         if(node.rightChild!= null)
         level.add(node.rightChild);
     }
}

https://github.com/camluca/Samples/blob/master/Tree.java在我的github中,你可以在类树中找到其他有用的函数,比如:

显示树

****......................................................****
                            42
            25                              65                              
    12              37              43              87              
9      13      30      --      --      --      --      99      
****......................................................****
Inorder traversal
9 12 13 25 30 37 42 43 65 87 99  
Preorder traversal
42 25 12 9 13 37 30 65 43 87 99  
Postorder traversal
9 13 12 30 37 25 43 99 87 65 42  
By Level
42 25 65 12 37 43 87 9 13 30 99  
票数 13
EN

Stack Overflow用户

发布于 2010-02-11 09:04:47

下面是我会怎么做:

levelOrder(List<TreeNode> n) {
    List<TreeNode> next = new List<TreeNode>();
    foreach(TreeNode t : n) {
        print(t);
        next.Add(t.left);
        next.Add(t.right);
    }
    println();
    levelOrder(next);
}

(最初是真正的代码-中途感到无聊,所以它是伪代码)

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2241513

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档