您的位置:首页 > 理论基础 > 数据结构算法

c语言数据结构--二叉树的遍历(递归与非递归)

2019-01-20 16:18 141 查看

二叉树的递归遍历(若空遍历结束)

先序遍历
1>访问根节点
2>先序递归左子树
3>先序递归右子树

算法

void PreOrder (BiTree bt)
{
if(bt==NULL)
return;
printf("%d",bt->data);//访问当前根节点数据
PreOrder(bt->lchild);
PreOrder(bt->rchild);
}

中序遍历将访问根节点数据放置遍历左子树之后;
后序遍历将访问根节点数据放置遍历右子树之后;

非递归遍历

无论是先序,中序还是后序,都是从根节点开始沿左子树深入下去,深入到最左端,无法深入下去时,返回。再沿刚才访问的左子树的结点访问其右子树,同样,当访问不下去,返回上一结点,继续以同样的方法遍历右子树。直到从最后根节点的右子树返回到根节点。
在这一过程中后深入的节点先返回,所以用栈来存储节点。

先序非递归遍历算法

void NRPreOrder(BiTree bt)
{
BiTNode* stack[MAXSIDE],p;
int top=-1;
if(bt==NULL)
return;
p=bt;
while(p==NULL&&top=-1)
{
while(p!=NULL)
{
printf("%d",p->data);//入栈前访问节点数据
top++;
stack[top]=p;//将节点指针压栈
p=p->lchild;//遍历左子树
}
if(top<0)
return;//栈空结束
else
{
p=stack[top];
top--;
p=p->rchild;//按栈顶结点遍历右子树
}
}

}

中序非递归遍历是把访问根节点与右子树写在一起,都放在出栈后。即将printf("%d",p->data);放在p=stack[top]与p->rchild之间。

后序非递归遍历

节点第一次出栈是在左子树后序遍历完之后按照出栈顺序访问右子树,但节点还未访问,所以需要再次入栈,出栈访问节点。
因为第一次出栈与二次进栈相连,所以为了区分,二次进栈时将栈顶元素设为负;

void NRPostOrder(BiTree bt)
{
BiTNode*stack[MAXSIZE],*p;
int top;
if(bt==NULL)
return;
top=-1;
p=bt;
while(!(p=NULL&&top=-1))
{
while(p!=NULL)
{
top++;
stack[top]=p;
p=p->lchild;//第一次入栈读左子树
}
if(top>-1)//栈不空
if(stack[top]>0)
{
p=stack[top]->rchild;//读右子树
stack[top]=-stack[top];//二次入栈
}
else//右子树读完栈顶元素小于0
{
p=-stack[top];
top--;
printf("%d",p->data);//读取节点数据
p=NULL;
}

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐