데이터 구조의 인쇄 이 진 트 리 모든 (루트 노드 시작) 경로 - 엄 울 민 데이터 구 조 를 정리 합 니 다.

1916 단어 데이터 구조
#include
#include
using namespace std;
#define STACKSIZE 20
#define SIZEADD 10
typedef char ElemType;
typedef struct BTNode
{
	ElemType data;
	struct BTNode *pLchild;
	struct BTNode *pRchild;
}BTNode,*pBTNode;
typedef struct Stack
{
	pBTNode *pBottom;
	pBTNode *pTop;
	int Stacksize;
}Stack;
void InitStack(Stack &S)
{
	S.pBottom = new pBTNode[STACKSIZE];
	S.pTop = S.pBottom;
	S.Stacksize = STACKSIZE;
}
void CreateBT(pBTNode &pT)
{
	ElemType c;
	cin >> c;
	if (c == '#')
		pT = NULL;
	else
	{
		pT = new BTNode;
		pT->data = c;
		CreateBT(pT->pLchild);
		CreateBT(pT->pRchild);
	}
}
bool StackEmpty(Stack S)
{
	if (S.pBottom == S.pTop)
		return true;
	else
		return false;
}
void Push(Stack &S, pBTNode pT)
{
	if (S.pTop - S.pBottom >= S.Stacksize)
	{
		S.pBottom = (pBTNode *)realloc(S.pBottom, (STACKSIZE + SIZEADD)*sizeof(pBTNode));
		S.pTop = S.pBottom + SIZEADD;
		S.Stacksize += SIZEADD;
	}
	*S.pTop++ = pT;
}
void Pop(Stack &S)
{
	if (StackEmpty(S))
		return;
	--S.pTop;
}
void Visit(pBTNode pT)
{
	cout << pT->data << " ";
}
void PreOrder(pBTNode pT)
{
	if (pT)
	{
		Visit(pT);
		PreOrder(pT->pLchild);
		PreOrder(pT->pRchild);
	}
}
void StackPrintAs(Stack S)
{
	pBTNode *ppT = S.pBottom;
	if (StackEmpty(S))
	{
		cout << "The Stack is empty!" << endl;
		return;
	}
	while (ppT < S.pTop)	
		Visit(*ppT++);	
	cout << endl;	
}
void PrintAllPath(pBTNode pT, Stack &S)
{
	if (pT)
	{
		Push(S, pT);
		if (!(pT->pLchild) && !(pT->pRchild))
			StackPrintAs(S);
		else
		{
			PrintAllPath(pT->pLchild, S);
			PrintAllPath(pT->pRchild, S);
		}
		Pop(S);
	}
}
int main(void)
{
	pBTNode pT; Stack S;
	CreateBT(pT);//"ABC##D##EF##G##"
	InitStack(S);
	PreOrder(pT);
	cout << endl;
	PrintAllPath(pT, S);
	return 0;
}

좋은 웹페이지 즐겨찾기