一、递归遍历方法:
先序遍历:
Status PreOrderTraverse(Tree *t) {
if (t == NULL) return OK;//合法性检查
else {
visit(t->data);//访问根节点
PreOrderTraverse(t->lchild);//递归遍历左子树
PreOrderTraverse(t->rchild);//递归遍历右子树
}
}
中序遍历
Status InOrderTraverse(Tree *t) {
if (t == NULL) return OK;//合法性检查
else {
PreOrderTraverse(t->lchild);//递归遍历左子树
visit(t->data);//访问根节点
PreOrderTraverse(t->rchild);//递归遍历右子树
}
}
后序遍历
Status PostOrderTraverse(Tree *t) {
if (t == NULL) return OK;//合法性检查
else {
PreOrderTraverse(t->lchild);//递归遍历左子树
PreOrderTraverse(t->rchild);//递归遍历右子树
visit(t->data);//访问根节点
}
}
三种遍历算法的分析:
二、非递归遍历算法:
Status PreOrderTraverse(Tree *t){
Tree p=t;InitStack(s);//初始化
while(p||!StackEmpty(s)){
if(p){
Push(s,p);printf("%c",q->data);
p=p->lchild;//入栈
}
else{
Pop(s,q);//出栈
p=q->rchild;
}
}
return OK;
}
Status InOrderTraverse(Tree *t){
Tree p=t;InitStack(s);//初始化
while(p||!StackEmpty(s)){
if(p){
Push(s,p);p=p->lchild;//入栈
}
else{
Pop(s,q);printf("%c",q->data);//出栈
p=q->rchild;
}
}
return OK;
}
三、 层次遍历算法
void LevelOrder(TreeNode* t) {
TreeNode* p; Queue *q;
InitQueue(q);//初始化队列;
InQueue(q,t);//根结点入队;
while(!QueueEmpty(q)){
DeQueue(q,p);//出队放入p中
printf("%c",p->data);//访问p结点;
if(p->lchild) InQueue(q,p->lchild);//左孩子不为空则入队;
if(p->rchild) InQueue(q,p->rchild);//右孩子不为空则入队;
}
}
原文链接:https://blog.csdn.net/weixin_46432495/article/details/120497774