我在遍历非二叉树并输出预订枚举时遇到了一些麻烦。
我目前的代码是:
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似乎明白了为什么。
任何人都可以看到我的代码或我遗失的错误吗?
答案 0 :(得分:1)
假设有一个函数pre-order-traversal(tree)
,它会执行以下操作:
pre-order-traversal(tree)
函数访问第一个子树。pre-order-traversal(tree)
,从左到右继续使用所有其他子树。您的代码不会遍历子树,只会(隐式)调用他们的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);
}