//二叉树先序遍历
void PreOrder(BiTree T)
{
if(T!=NULL)
{
visit(T);
PreOrder(T->lchild);
PreOrder(T->rchild);
}
}
//二叉树中序遍历
void InOrder(BiTree T)
{
if(T!=NULL)
{
PreOrder(T->lchild);
visit(T);
PreOrder(T->rchild);
}
}
//二叉树后序遍历
void PostOrder(BiTree T)
{
if(T!=NULL)
{
PreOrder(T->lchild);
PreOrder(T->rchild);
visit(T);
}
}
//中序遍历非递归算法
void InOrder2(BiTree T)
{
Initstack(s);
BiTree p=T;
while(p!=NULL||!Isempty(s))
{
if(p!=NULL)
{
push(s,p);
p=p->lchild;
}
else{
pop(s,p);
visit(p);
p=p->rchild;
}
}
}
//前序遍历非递归算法
void PreOrder2(BiTree T)
{
Initstack(s);
BiTree p=T;
while(p!=NULL||!Isempty(s))
{
if(p!=NULL)
{
visit(p);
push(s,p);
p=p->lchild;
}
else{
pop(s,p);
p=p->rchild;
}
}
}
//土办法找中序前趋
void InOrder(BiTree T)
{
if(T!=NULL)
{
PreOrder(T->lchild);
visit(T);
PreOrder(T->rchild);
}
}
void visit(BiTNode *q)
{
if(p==q)
fianl=pre;
else
pre=q;
}
//中序线索化
void InThread(ThreadTree T)
{
if(T!=NULL)
{
InThread(T->lchild);
visit(T);
InThread(T->rchild);
}
}
void visit(ThreadNode *q)
{
if(q->lchild==NULL)
{
q->lchild=pre;
q->ltag=1;
if(pre!=NULL&&pre->rchild==NULL)
{
pre->rchild=q;
pre->rtag=1;
}
pre=q;
}
}
ThreadNode *pre=NULL;
//中序线索化2
void CreateInThread(ThreadTree T)
{
ThreadNode pre=NULL;
if(T!=NULL)
{
InThread(T,pre);
pre->rchild=NULL;
pre->rtag=1;
}
}
void InThread(ThreadTree &p,ThreadTree &pre)
{
if(p!=NULL)
{
InThread(p->lchild,pre);
if(p->lchild==NULL)
{
p->lchild=pre;
p->ltag=1;
}
if(pre!=NULL&&pre->rchild==NULL)
{
pre->rchild=p;
pre->ltag=1;
}
pre=q;
InThread(p->rchild,pre);
}
}
//中序遍历下第一个结点
ThreadNode *Firstnode(ThreadNode *p)
{
while(p->ltag==0) p=p->lchild;
return p;
}
//中序线索二叉树中结点p的后继
ThreadNode *Nextnode(ThreadNode *p)
{
if(p->rtag==0) return FirstNode(p->rchild);
else return p->rchild;
}
//中序线索二叉树中序遍历算法
void InOrder(ThreadNode *T)
{
for(ThreadNode *p=Firstnode(T);p!=NULL;p=Nextnode(p))
visit(p);
}