一、树的先序遍历
参考书P128-P132,先序列遍历是,先访问根结点,先序遍历左子树,然后先序遍历右子树递归下去。
二、树的遍历实现
1、递归遍历
Status PreOederTraverse(BiTree T, Status(*Visit)(TElemType e)){
//利用先序遍历 二叉树 对每个元素进行visit函数 //递归的形式
if (T)
{
Visit(T->data);
PreOederTraverse(T->lchild, Visit);
PreOederTraverse(T->rchild, Visit);
}
return OK;
}
2、栈的遍历
这里要说明下思想,其实栈中进栈的都是还没有遍历右子树的的结点。
Status InOrderTraverse(BiTree T,Status (*Visit)(TElemType e)){
//利用栈的形式先序遍历二叉树 非递归版本
SqStack stack;//栈中可以理解为 结点中没有进右结点的就进栈
InitStack(stack);
BiTree p = T;
while (p || !StackEmpty(stack))
{
if (p)
{
//当前结点不为空的情况下 进入栈中 进入左树
Visit(p->data);
Push(stack, p);
p = p->lchild;
}
else
{
//当前结点是空的
Pop(stack,p);
p = p->rchild;
}
}
return OK;
}
三、执行
char * preStr = "ABC##DE#G##F###";//先序遍历字符串
BiTree tree;
CreateBiTree(tree,preStr);
printf("\n先序遍历\n");
PreOederTraverse(tree,PrintElement);
//PrintTree_L(tree,0);
printf("\n先序遍历\n");
InOrderTraverse(tree, PrintElement);
输出:
先序遍历
ABCDEGF
先序遍历
ABCDEGF请按任意键继续. . .