前序遍历
知识点总结报告
知识点:
前序遍历
(原理)前序遍历二叉树过程
(1)访问根结点
(2)先序遍历左子树
(3)先序遍历右子树
中序遍历递归算法
void PreOrder(BTNode *b) //先序遍历的递归算法
{ if (b!=NULL)
{ printf("%c ",b->data); //访问根节点
PreOrder(b->lchild); //递归访问左子树
PreOrder(b->rchild); //递归访问右子树
}
}
前序遍历非递归算法
采用顺序栈存储结构,类型声明如下
typedef struct //存放栈中数据元素
{ BTNode * data[MaxSize]; //存放栈顶指针
int top; //顺序栈存储类型
}SqStack;
非递归算法1
void PreOrder1(BTNode *b) //先序非递归遍历算法1
{ BTNode *p;
SqSack *st; //定义栈指针st
InitStack(st); //初始化栈st
if(b!=NULL)
{ Push(st,b); //根结点进栈
while(!=StackEmpty(st)) //栈不为空时循环
{ Pop(st,p); //退栈结点p并访问它
printf("%c",p->data);
if(p->rchild!=NULL) //有右孩子时将其进栈
Push(st,p->rchild);
if(p->lchild!=NULL) //有左孩子时将其进栈
Push(st,p->lchild);
}
printf("\n");
}
DestroyStack(st); //销毁栈
}
二叉链表中前序遍历非递归算法
void PreOrder2(BTNode *b) //先序遍历非递归算法2
{ BTNode *p;
SqStack *st; //定义一个顺序栈指针st
InitStack(st); //初始化栈st
p=b;
while(!StackEmpty(st)||p!=NULL)
{ while(p!=NULL) //访问结点p及其所有左下结点并进栈
{ printf("%c",p->data); //访问结点p
Push(st,p); //结点p进栈
p=p->lchild; //移动到左孩子
}
if(!StackEmpty(st)) //若栈不空
{ Pop(st,p); //出栈结点p
p=p->rchild; //转向处理其右子树
}
}
printf("\n");
DestroyStack(st); //销毁栈
}