1. 程式人生 > >7-9 採用後序遍歷非遞迴演算法輸出從根節點到每個葉子節點的路徑逆序列

7-9 採用後序遍歷非遞迴演算法輸出從根節點到每個葉子節點的路徑逆序列

//採用後序遍歷非遞迴演算法輸出從根節點到每個葉子節點的路徑逆序列
#include "btree.cpp"

typedef struct 
{	BTNode *data[MaxSize];			//存放棧中的資料元素
	int top;						//存放棧頂指標,即棧頂元素在data陣列中的下標
} SqStack;							//順序棧型別

void InitStack(SqStack *&s)			//初始化棧
{	s=(SqStack *)malloc(sizeof(SqStack));//分配一個是順序棧空間,首地址存放在s中
	s->top=-1;						//棧頂指標置為-1
}
void DestroyStack(SqStack *&s)		//銷燬棧
{
	free(s);
}
bool StackEmpty(SqStack *s)			//判斷棧是否為空
{
	return(s->top==-1);
}
bool Push(SqStack *&s,BTNode *e)	//進棧
{	if (s->top==MaxSize-1)			//棧滿的情況,即棧上溢位
		return false;
	s->top++;						//棧頂指標增1
	s->data[s->top]=e;				//元素e放在棧頂指標處
	return true;
}
bool Pop(SqStack *&s,BTNode *&e)	//出棧
{	if (s->top==-1)					//棧為空的情況,即棧下溢位
		return false;
	e=s->data[s->top];				//取棧頂指標元素的元素
	s->top--;						//棧頂指標減1
	return true;
}
bool GetTop(SqStack *s,BTNode *&e)	//取棧頂元素
{	if (s->top==-1)					//棧為空的情況,即棧下溢位
		return false;
	e=s->data[s->top];				//取棧頂元素
	return true;
}
void AllPath1(BTNode *b)
{	BTNode *p,*r;
	bool flag;
	SqStack *st;					//定義一個順序棧指標st
	InitStack(st);					//初始化棧st
	p=b;
	do
	{	while (p!=NULL)				//掃描節點p的所有左下節點並進棧
		{	Push(st,p);				//節點p進棧
			p=p->lchild;			//移動到左孩子
		}
		r=NULL;						//r指向剛剛訪問的節點,初始時為空
		flag=true;					//flag為真表示正在處理棧頂節點
		while (!StackEmpty(st) && flag)
		{	GetTop(st,p);			//取出當前的棧頂節點p
			if (p->rchild==r)		//若節點p的右孩子為空或者為剛剛訪問過的節點
			{	if (p->lchild==NULL && p->rchild==NULL)	//若為葉子節點
				{					//輸出棧中所有節點值
					for (int i=st->top;i>0;i--)
						printf("%c->",st->data[i]->data);
					printf("%c\n",st->data[0]->data);
				}
				Pop(st,p);
				r=p;				//r指向剛訪問過的節點
			}
			else
			{	p=p->rchild;		//轉向處理其右子樹
				flag=false;			//表示當前不是處理棧頂節點
			}
		}
	} while (!StackEmpty(st));		//棧不空迴圈
}

int main()
{
	BTNode *b;
	CreateBTree(b,"A(B(D(,G)),C(E,F))");
	printf("b:");DispBTree(b);printf("\n");
	printf("輸出所有從葉子節點到根節點的序列:\n");
	AllPath1(b);
	DestroyBTree(b);
	return 1;
}