我花了几个小时试图弄清楚为什么它不会在最后打印根节点。
它无法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
执行:
这里至少有一个问题:
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