由先序遍历的特点:根左右,先序遍历的最后一个结点最先考虑为右子树,然后是左子树,且最后一个结点为叶子结点。
//先序遍历二叉树 (非递归)
void PreOrder(BiTree T){
// BiTree s[M];
// int top=0;
BiTree p=T;
Stack S;
InitStack(S);
printf("先序遍历为:");
while(p || !isEmptyStack(S)){
if(p){
printf("%c",p->data);
// s[top++]=p;
Push(S,p);
p=p->lchild;
}
else{
// p=s[--top];
Pop(S,p);
p=p->rchild;
}
}
printf("\n");
}
//求先序遍历的最后一个结点
void PreOrder_last(BiTree T){
BiTree p=T;
while(p){
if(p->rchild) p=p->rchild;
else if(p->lchild) p=p->lchild;
else{
printf("该二叉树先序遍历的最后一个结点为:%c\n",p->data);
return;
}
}
}
//求先序遍历的最后一个结点(递归)
void PreOrder_last_recursion(BiTree T){
if(T->rchild) PreOrder_last_recursion(T->rchild);
else if(T->lchild) PreOrder_last_recursion(T->lchild);
else{
printf("该二叉树先序遍历的最后一个结点为(递归):%c\n",T->data);
return;
}
}