二叉树的遍历和线索二叉树
Posted lingyefengzi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树的遍历和线索二叉树相关的知识,希望对你有一定的参考价值。
二叉树的遍历和线索二叉树
递归遍历
先序遍历
void PreOrder(BiTree T)
if(T != NULL)
visit(T);
PreOrder(T->lchild);
PreOrder(T-rchild);
中序遍历
void InOrder(BiTree T)
if(T != NULL)
InOrder(T->lchild);
visit(T);
InOrder(T->rchild);
后序遍历
void PostOrder(BiTree T)
if(T != NULL)
PostOrder(T->lchild);
PostOrder(T->rchild);
visit(T);
非递归遍历
先序遍历非递归算法
void PreOrderTraverse(BiTree T)
InitStack(S);
BiTree p=T;
while(p||!IsEmpty(S)) //栈不空或p不空时循环
if(p)
visit(p);
Push(S,p);
p=p->lchild;
else
Pop(S,p);
p=p->rchild;
中序遍历非递归算法
void InOrderTraverse(BiTree T)
InitStack(S);
BiTree p=T;
while(p||!IsEmpty(S))
if(p)
Push(S,p);
p=p->lchild;
else
Pop(S,p);
visit(p);
p=p->rchild;
后序遍历非递归算法
后序非递归遍历二叉树的顺序是先访问左子树,再访问右子树,最后访问根结点。
当用堆栈来存储结点时,必须分清楚返回根结点时是从左子树返回还是从右子树返回的。
所以,使用辅助指针r,其指向最近访问过的结点。也可在结点中增加一个标志域,记录是否已被访问。
void PostOrder(BiTree T)
InitStack(S);
p=T;
r=NULL;
while(p||!IsEmpty(S))
if(p)
Push(S,p);
p=p->lchild;
else
GetTop(S,p); //注意不是出栈,是取栈顶元素
if(p->rchild&&p->rchild!=r) //若右子树存在,且未被访问过
p=p->rchild;
Push(S,p);
p=p->lchild;
else //右子树已经访问或为空,接下来出栈访问结点
Pop(S,p);
visit(p->data);
r=p;
p=NULL; //使p为空,从而继续访问栈顶
以上是关于二叉树的遍历和线索二叉树的主要内容,如果未能解决你的问题,请参考以下文章