当前位置: 首页 > 知识库问答 >
问题:

c二叉查找树后期顺序遍历迭代使用堆栈

松国兴
2023-03-14

我花了几个小时试图弄清楚为什么它不会在最后打印根节点。

它无法current=pop(

我不知道出了什么问题。

算法:

1.1 创建一个空堆栈 2.1 在根不为空时执行以下操作 a) 将根的右子级推送到堆栈。b)将根设置为根的左子级。2.2 从堆栈中弹出一个项目并将其设置为root。a) 如果弹出的项目有一个正确的子项,并且正确的子项位于堆栈的顶部,则从堆栈中删除正确的子项,将根推回并将根设置为根的右子项。b) 否则打印根的数据并将根设置为 NULL。2.3 在堆栈不为空时重复步骤 2.1 和 2.2。

我将其可视化,并将其绘制在白板上,逻辑对我来说很好。然而,当实现它时,它在最后一次迭代时崩溃。

void postOrderIterativeS1(BSTNode *root)
{
    Stack S;
    S.top = NULL;
    BSTNode *current = root;

    int shouldContinue = 1;
    while(shouldContinue)
    {

        if(current != NULL)
        {

            if(current->right != NULL){


            push(&S, current->right);
            }

            push(&S, current);



            current = current->left;
        }
        else
        {
            current = pop(&S);
            if(peek(&S) == NULL){
                shouldContinue = 0;
            }
            if(current->right != NULL && peek(&S)->item == current->right->item)
            {
                pop(&S);
                push(&S,current);
                current = current->right;
            }

            else


            {

                int items= current->item;
                printf("%d ", current->item);
                current = NULL;
            }

        }

    }
}

如果你想要完整的代码,https://pastebin.com/z4rPebrJ

执行:


共有1个答案

易昌翰
2023-03-14

这里至少有一个问题:

  current = pop(&S);
  if (peek(&S) == NULL) {
    shouldContinue = 0; 
    // peek(&S) is NULL here 
    // but in the if below you dereference peek(&S) which is NULL
    // and therefore you get a crash
  }
  if (current->right != NULL && peek(&S)->item == current->right->item)
  {
    pop(&S);
    push(&S, current);
    current = current->right;
  }

只要改变这一点:

if (current->right != NULL && peek(&S)->item == current->right->item)

为此:

if (shouldContinue && current->right != NULL && peek(&S)->item == current->right->item)
 类似资料:
  • 从顺序和后序遍历迭代构造二叉树。 我已经了解了如何使用递归,但我正在寻找一个迭代构造二叉树的答案。 我为inorder和preorder编写了一个算法,但我想知道如何修改inorder和postorder的算法? 注意:它是伪代码,“=”意味着“==” 节点: 二叉树: 子算法树(前序、有序) pre:preorder:Int[],inoorder:Int[] 末端子算法 编辑:我找到了答案

  • 我正在学习如何使用Postorder遍历删除二叉树。我知道要删除一个节点,首先我们需要删除它的子节点,然后是节点本身,所以Postorder遍历最适合删除二叉树。我想使用Inorder遍历做同样的事情,一切都很好,但我不明白下面的代码是如何工作的?

  • 我试图使用队列的链表实现实现二叉搜索树的级别顺序遍历。 我已经检查了二叉查找树的实现,它是好的。队列的链表实现也是正确的。在这里,我试图访问节点并将其子节点排队。然后使用弹出函数实际访问节点。 这最终是通过递归调用完成的。当我运行以下代码时,我以不同的顺序获得输出。

  • 我想对二叉树执行级别顺序遍历。因此,对于给定的树,说: 产出将是: 我知道我可以使用某种队列,但在C中递归地实现这一点的算法是什么?感谢您的帮助。

  • 我尝试按如下方式执行二叉树的垂直顺序遍历:1)找出每个节点与根节点之间的最小和最大水平距离2)创建一个hashmap,将水平距离映射到相应的节点(Map) 然而,我得到了不想要的输出,我认为在实现中有一些错误,因为算法对我来说似乎是正确的。 以下是完整的代码: 输出:{-1=[99999],0=[99999,12],-2=[99999],1=[99999],2=[99999]}那么我的apProc

  • 这是一个leetcode问题。 给定一个二叉树,返回其节点值的级序遍历(即从左到右,逐级)。 例如:给定二叉树, 将其级别顺序遍历返回为: 但我正在用JavaScript尝试一种新的方式,而不是完全按照他们的解决方案。到目前为止,我能够打印阵列,但 如何在新行中打印不同的级别 以下是我目前的代码: 输入:[3,9,20,空,空,15,7], LeetCode问题链接:BinarytreeTrave