数据结构(知识点碎片十七)

69 阅读3分钟

【补充】对于已经转化成二叉树的树,如果想对其进行先序遍历,只需对这棵树直接进行先序遍历即可;对于已经转化成二叉树的树,如果想对其进行中序遍历,只需对这棵树直接进行后序遍历即可

6. 二叉树非递归遍历(用栈辅助)

  • 先序遍历非递归化

用栈,根结点入栈再出栈一个元素,孩子结点入栈(左孩子后入栈)再出栈一个元素,并对该元素的孩子进行入栈操作,没有孩子就出栈,继续判断有无孩子,以此类推

首先从根节点开始入栈一个节点然后不停地重复以下操作:如果栈不空就要出栈一个元素并对其访问之后,把其左右孩子(如果存在的话)都入栈(注意入栈顺序),如果在刚才我们出栈的时候栈为空,就说明整个遍历结束了。这就是借助自己设定的栈来实现先序遍历的方法

void preorderNonrecursion (BTNode *bt) //没有失败的情况,不需要返回
{
if(bt != NULL)
{
BTNode *Stack[maxSizel; int top = -1;BTNode *p =NULL; Stack[++top] = bt; 
while(top! = -1)
{
p = Stack[top--]; 
Visit(p);      //访问
if(p->rChild!= NULL)
Stack[++top] = p->rChild; 
if(p->lChild!= NULL)
stack[++top] = p->lChild;
}
}
}
  • 后序遍历非递归化

只要在先序的时候把左右子树的位置颠倒一下即为逆后序

void postorderNonrecursion(BTNode *bt)
{
if (bt!=NULL)
{
BTNode *Stack1[maxSize]; int top1=-1; 
BTNode *Stack2 [maxSize]; int top2=-1; 
BTNode *p =NULL;  //遍历指针
stackl[++topl] = bt; 
while (top1 != -1)
{
p = Stack1[top1--]; 
Stack2[++top2] = p;
if (p->lChild != NULL)
Stackl[++top1] = p->lChild; 
if (p->rChild != NULL)
Stack1[++top1] = p->rChild;
}
while (top2 !=-1)
{
p=Stack2[top2--];
Visit(p);
}
}
  • 中序遍历非递归化

用栈,从根开始进栈,有左孩子就一直入栈,无左孩子出栈,看出栈元素是否有右孩子,有则进栈无继续出栈;左部全部进栈完再进右部(与左部同理)

void inorderNonrecursion (BTNode *bt)
{
if(bt != NULL)
{
BTNode *Stack[maxSize]; int top =-1; 
BTNode *p=NULL; 
p=bt;
while(top != -1 || p != NULL) //要考虑右子树的情况所以条件还要或p!=NULL
{
while(p != NULL)
{
Stack[++topl=p; 
p = p->lChild;
}
if(top != -1)
{
p = Stack[top--]; 
Visit(p);
p =p->rChild;
}
}
}
}

7. 线索二叉树

规定:当某结点的左指针为空时,令该指针指向这个线性序列中该结点的前驱结点;当某结点的右指针为空时,令该指针指向这个线性序列中该结点的后继结点,这样的指向该线性序列中的“前驱结点”和“后继结点”的指针称为线索(thread)。
创建线索的过程称为线索化。线索化的二叉树称为线索二叉树(threadedbinary-tree)。

  • 中序线索二叉树
typedef struct TBTNode
{
int data; 
int lTag; 
int rTag;
TBTNode* lChild; 
TBTNode* rChild;
}TBTNode;
void inThread(TBTNode *p, TBTNode	*&pre)	
{
if(p !=NULL)
{
inThread(p->lChild, pre); 
if(p->1Child == NULL)
{
p->lChild = pre; 
p->1Tag = 1;
}
if(pre != NULL && pre->rChild == NULL)
{
pre->rChild = p;
pre->rTag = 1;
}
pre = p;
inThread(p->rChild, pre);
}
}
  • 前序线索二叉树
void preThread(TBTNode *p,TBTNode *&pre)
{
if(p != NULL)
{
if(p->lChild == NULL)
{
p->lChild = pre; 
p->1Tag = 1;
}
if(pre != NULL && pre->rChild == NULL)
{
pre->rChild = p; 
pre->rTag =l;
pre = p;
if (p->1Tag =0)
preThread (p->lChild,pre); 
if(p->rTag =0)
preThread(p->rChild,pre);
}
}
void preOrder(TBTNode *tbt)
{
if(tbt != NULL)
{
TBTNode *p = tbt; 
while(p != NULL)
{
while(p->lTag ==0)
{
Visit(p);
p = p->lChild;
}
Visit(p);
p = p->rChild;
}
}
}