二叉树中序非递归遍历算法和构造二叉线索树算法的理解
二叉树中序非递归遍历算法:
先将左子树放进栈中,无左子树时出栈,从右子树开始,继续对右子树循环。
代码如下:
void inOrder2(BinTree *root) //非递归中序遍历 2 { 3 stack<BinTree*> s; 4 BinTree *p=root; 5 while(p!=NULL||!s.empty()) 6 { 7 while(p!=NULL) 8 { 9 s.push(p); 10 p=p->lchild; 11 } 12 if(!s.empty()) 13 { 14 p=s.top(); 15 cout<<p->data<<" "; 16 s.pop(); 17 p=p->rchild; 18 } 19 } 20 }
可以这么理解:此算法的排序,对于每一个结点,其左结点一定在其父母结点前面,右结点一定在其父母结点后面,符合此条件的排序只有中序排序。
二叉线索树构造:其中的pre是一个全局变量,将递归分解成小子量看,每一个小函数中,其pre都不断变化,且都满足是下一个即将进行的函数结点pre。
代码如下:
bithptr*pre=NULL;
/*全程变量*/
voidINTHREAD(bithptr*p)
{
if
(p!=NULL)
{
if
(p->ltag==0)
INTHREAD(p->lchild);
/*左子树线索化*/
if
(p->lchild==NULL)
{
p->ltag=1;
p->lchild=pre;
}
if
(p->rchild==NULL)
p->rtag=1;
if
(pre!=NULL&&pre->rtag==1)
pre->rchild=p;
pre=p;
/*前驱指向当前结点*/
if
(p->rtag==0)
INTHREAD(p->rchild);
/*右子树线索化*/
}
}