第一题:
bool InOrderTraverse(BinNode *Node,void (*fun)(BinNode *Node))
{
Stack S;//声明栈
InitBtStack(&);//初始化栈
while(!StackIsEmpty(&S)||Node)//栈空且节点为NULL是遍历完成
{
while(Node->lchild)//如果<节点左子树非空>则进栈,直到左子树为空的节点
{
Push(&S,&Node);
Node = Node->lchild;
}//while
(*fun)(Node); //访问该节点(左子树为空的节点)
Node = Node->rchlid; //转向其右子树
while(!StackIsEmpty(&S)&&!Node)//如果栈非空且右子树为空,弹出并退 { //回栈顶节点,访问之,一直到右子树非空的节点
Pop(&S,&Node);
(*fun)(Node); //访问之
Node = Node->rchlid;//转向其右子树(出栈节点的左子树必然已被遍历)
}//while
}//while
DestroyStack(&S);
return true;
}//InOrderTraverse
第二题:
第一个while是把栈S的中的元素临时转移到栈T中,直到遇到等于e的(e出栈S但没有进栈T)。
第二个while是把栈T中的元素全部放回栈S中。
结果是 :删除了S栈中<离栈顶最近,值为e>的元素。
第三题:stack
第四题:
前序串的K应该是D。
树的构型:
A
/ \
B F
/ \ \
E C G
\ / \
D H J
\
I
后序序列 :EDCBIHJGFA
根据后序序列易得线索:
E:lchild=NULL right=&D
C:lchild=&D
D:lchild=&E right=&C
F:lchild=&G
H:lchild=&I
I :lchild=&B right=&H
J:lchild=&H right=&G