二叉树的链式存储结构:
typedef struct BTNode
{
ElemType data;
struct BTNode *lchild, *rchild;
} BTNode;
前序非递归遍历算法:
设T是指向二叉树根结点的指针变量,非递归算法:
若二叉树为空,则返回;否则,令p = T;
(1)访问p所指向的结点;
(2)若p不为空,p进栈,p = p->lchild;
(3)p = p->rchild,转(1);
直到栈空为止。
void PreOrder(BTNode *b)
{
BTNode *St[MaxSize], *p;
int top = -1;
p = b;
while (top > -1 || p != NULL)
{
while (p != NULL) //扫描*p的所有左结点并进栈
{
printf("%c ", p->data);
top++;
St[top] = p;
p = p->lchild
}
if (top > -1)
{
p = St[top];top--;//出栈*P结点
p = p->rchild;//处理右子树
}
}
}
中序非递归遍历算法:
设T是指向二叉树根结点的指针变量,非递归算法:
若二叉树为空,则返回;否则,令p = T;
(1)若p不为空,p进栈,p = p->lchild;
(2)否则(即p为空),退栈到p,访问p所指向的结点;
(3)p = p->rchild,转(1);
直到栈空为止。
void InOrder(BTNOde *b) //中序非递归遍历算法
{
BTNode *St[MaxSize], *p;
int top = -1;
p = b;
while (top > -1 || p != NULL) //扫描*p左子树,直到为空
{
while (p != NULL)
{
top++;
St[top] = p;
p = p->lchild;
}
if (top > -1)
{
p = St[top];top--;//出栈
printf("%c ", p->data);//访问结点
p = p->rchild;
}
}
}