将递归二叉树遍历转换为迭代

2023-12-21

我被要求编写迭代版本,但我编写了递归版本,即

void inorderTraverse(BinaryTree root)
{
    if(root==NULL)
        printf("%d",root->id);
    else
    {
        inorderTraverse(root->left);
        printf("%d",root->id);
        inorderTraverse(root->right);
    }
}

我不是在寻找代码,我想了解如何做到这一点。如果这只是最后一次递归调用,我就会这样做

void inorderTraverse(BinaryTree root)
{
    while(root!=NULL)
    {
        printf("%d",root->id);
        root=root->right;
    }
}

But 当有两次递归调用时,如何转换为迭代程序?

这是类型定义。

struct element{
    struct element* parent;
    int id;
    char* name;
    struct element* left;
    struct element* right;
};
typedef element* BinaryTree;

这就是我的想法,我的方向正确吗?

temp=root;
while(1)
{
    while(temp!=NULL)
    {
     push(s,temp);
     temp=temp->left;
     continue;
    }

    temp=pop(s);
    if(temp==NULL)
    return;
    printf("%d\t",temp->data);
    temp=temp->right;
}

您看到的问题是您需要“记住”最后一个地方你正在迭代。
在进行递归时,程序内部使用“堆栈”来记住要返回到哪里。
但在进行迭代时,却不然。

虽然……这给了你一个想法吗?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将递归二叉树遍历转换为迭代 的相关文章

随机推荐