Java非二叉树预订遍历

时间:2014-12-14 17:16:18

标签: java tree

我在遍历非二叉树并输出预订枚举时遇到了一些麻烦。

我目前的代码是:

  public String GetPreOrder(ADS2TreeNode root, String res)
  {        
      res += data;
      if (numberOfChildren != 0)
      {
          for (int i = 0; i < numberOfChildren; i++)
          {
              res += "," + children[i];
          }            
      }      
   return res;              
  }


  public String GetPreOrder()
  {  
      String res = "";
      return root.GetPreOrder(root, res);
  }

基于&#34;(B(E(K),F))的测试数据&#34; 它输出B,E(K),F 但它应该输出B,E,K,F

我相信这是因为它只是打印存储E子代的数组而不是单独访问它们?但是我不确定如何做到这一点。

任何人都可以了解为什么会发生这种情况以及如何解决这个问题?

我现在遇到以下代码的问题:

 public String GetPreOrder(ADS2TreeNode root, String res)
  {    
      if (root.numberOfChildren == 0)
      {
          res += root.data;
          root = root.parent;
      }
      else
      {


      for (int i = 0; i < root.numberOfChildren; i++)
          {
              res += root.data + ',';
              root = root.getChild(i);
              res = GetPreOrder(root, res);
          }

       }          
        return res;     
  }

在调试它的同时,它会循环遍历每个子树,但是它并没有完全到达树的末端 - 我花了很多时间试图通过调试来解决它,但我可以&#39似乎明白了为什么。

任何人都可以看到我的代码或我遗失的错误吗?

1 个答案:

答案 0 :(得分:1)

假设有一个函数pre-order-traversal(tree),它会执行以下操作:

  1. 访问根并显示其值/内容/等。
  2. 通过递归调用pre-order-traversal(tree)函数访问第一个子树。
  3. 通过递归方式调用pre-order-traversal(tree),从左到右继续使用所有其他子树。
  4. 您的代码不会遍历子树,只会(隐式)调用他们的toString()方法,这些方法会在括号中显示给定子树及其子项。

    因此,解决方案是递归地调用孩子们的GetPreOrder(...),因为他们也是树。

    出现第二个问题是因为您将root重置为第一个孩子。因此,在for循环的第二次迭代中,不使用真实的根,而是使用第一个子树根。只需不重用参数root并改为使用局部变量。

    res += root.data + ',';
    for (int i = 0; i < numberOfChildren; i++)
    {
        ADS2TreeNode child = root.getChild(i);
        res += GetPreOrder(child, res);
    }
    

    如果你能以某种方式从问题的第一部分访问数组,你可以使用更好的for-each-loop。

    res += root.data + ',';
    for(ADS2TreeNode child : children) {
        res += GetPreOrder(child, res);
    }