我正在尝试遍历使用键盘输入数据构建的二叉树。数据已成功插入二叉树。我有一个switch语句,其中' case 4'应逐级遍历(和打印)二叉树。但是我收到了EXC_BAD_ACCESS错误。如果有人帮我解决这个问题,我会非常高兴。
(RootPtr是全局定义的二叉树的顶级0节点; TreeDepth()是树的函数计算"深度"其中Depth全局定义,根节点深度为0;和GetNode基本上是类型TreePtr指针的初始化函数(使用malloc)。)
提前谢谢大家。
以下是相关代码:
这是结构定义;
typedef struct treeItem
{
int data;
struct treeItem *left;
struct treeItem *right;
}Tree , *TreePtr;
这是我称之为逐级遍历功能的开关案例;
case 4:
TreePtr temp;
GetNode(&temp);
temp = RootPtr;
printLevelOrder(temp);
printf("\n\n");
break;
这些是用于逐层遍历树级的函数;
void printGivenLevel(TreePtr TemPtr, int level)
{
if (items == 0)
return;
else
{ if(level == 0 )
{
printf(" %d", (*TemPtr).data); //the line I got ERROR
}
else
{
printGivenLevel((*TemPtr).left, (level-1));
printGivenLevel((*TemPtr).right, (level-1));
}
}
}
void printLevelOrder(TreePtr TemPtr)
{
TreeDepth();
if (items == 0)
printf("\nTree is empty.\n");
else
{
printf("Traverse level by level:");
for (int i=0; i<=Depth; i++)
{
printGivenLevel(TemPtr, i);
}
}
}
答案 0 :(得分:1)
这是一个错误。在你的for循环中:
for (int i=0; i<=Depth; i++)
你正在遍历这个循环Depth + 1
次。这意味着您尝试访问的级别比实际更多。特别是,在printGivenLevel
的最后调用中,在level == 1
的递归中,您已经位于树的底部。您现在再次递归,但是传递到下一个递归级别的指针是垃圾指针(它们不能保证指向您允许访问的内存,甚至存在)。因此,当您尝试取消引用它们时,会出现错误。
还有一件事:这种实现效率非常低,因为你多次遍历树。最好先进行广度搜索,比如提到的kiss-o-matic。这样,你只会遍历树一次,这要快得多(虽然它确实使用了更多的内存)。