二叉树中序非递归遍历算法和构造二叉线索树算法的理解

二叉树中序非递归遍历算法:

                             先将左子树放进栈中,无左子树时出栈,从右子树开始,继续对右子树循环。 

             代码如下:

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); /*右子树线索化*/
}
}

猜你喜欢

转载自www.cnblogs.com/xuehongyang/p/10520141.html