二叉树中序非递归遍历算法和构造二叉线索树算法的理解
二叉树中序非递归遍历算法:
先将左子树放进栈中,无左子树时出栈,从右子树开始,继续对右子树循环。
代码如下:
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);/*右子树线索化*/}}

浙公网安备 33010602011771号