按级别

时间:2016-01-11 17:05:29

标签: c++ binary-tree tree-traversal

我正在尝试遍历使用键盘输入数据构建的二叉树。数据已成功插入二叉树。我有一个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);
        }
    }
}

1 个答案:

答案 0 :(得分:1)

这是一个错误。在你的for循环中:

for (int i=0; i<=Depth; i++)

你正在遍历这个循环Depth + 1次。这意味着您尝试访问的级别比实际更多。特别是,在printGivenLevel的最后调用中,在level == 1的递归中,您已经位于树的底部。您现在再次递归,但是传递到下一个递归级别的指针是垃圾指针(它们不能保证指向您允许访问的内存,甚至存在)。因此,当您尝试取消引用它们时,会出现错误。

还有一件事:这种实现效率非常低,因为你多次遍历树。最好先进行广度搜索,比如提到的kiss-o-matic。这样,你只会遍历树一次,这要快得多(虽然它确实使用了更多的内存)。