数据结构cpp二叉树

数据结构cpp二叉树

May 21, 2010
using namespace std;


typedef struct btreenode
{
	char data;
	struct btreenode *lchild;
	struct btreenode *rchild;
}BTreeNode, *BTree;

typedef struct
{
	BTree link;
	int flag;
}Stack;


void InitBTree(BTree &BT)
{
	BT = NULL;
}


void CreatBTree(BTree &BT)
{
	char ch;
	ch = getchar();
	if (ch == ' ')
		BT = NULL;
	else
	{
		BT = new BTreeNode;
		BT->data = ch;
		CreatBTree(BT->lchild);
		CreatBTree(BT->rchild);
	}
}
void PreOrder(BTree BT)
{
	if (BT == NULL)
	{
		cout << "NULL";
		return;
	}
	else
	{
		cout << BT->data;
		if (BT->lchild != NULL)
			PreOrder(BT->lchild);
		if (BT->rchild != NULL)
			PreOrder(BT->rchild);
	}
}


void InOrder(BTree BT)
{
	if (BT == NULL)
	{
		cout << "NULL";
		return;
	}



	if (BT->lchild != NULL)
		InOrder(BT->lchild);


	cout << BT->data;


	if (BT->rchild != NULL)
		InOrder(BT->rchild);

}


void PostOrder(BTree BT)
{
	if (BT == NULL)
	{
		cout << "NULL";
		return;
	}


	if (BT->lchild != NULL)
		PostOrder(BT->lchild);


	if (BT->rchild != NULL)
		PostOrder(BT->rchild);


	cout << BT->data;

}


void LevelOrder(BTree BT)
{
	BTree Queue[30];
	int front, rear;
	if (BT == NULL) return;

	front = -1;
	rear = 0;
	Queue[rear] = BT;


	while (front != rear)
	{
		front++;
		cout << Queue[front]->data;
		if (Queue[front]->lchild != NULL)
		{
			rear++;
			Queue[rear] = Queue[front]->lchild;
		}


		if (Queue[front]->rchild != NULL)
		{
			rear++;
			Queue[rear] = Queue[front]->rchild;
		}
	}
}


void PreOrder_2(BTree BT)
{
	BTree stack[30], p;
	int top;
	if (BT == NULL) return;
	top = -1;
	p = BT;
	while (!(p == NULL && top == -1))
	{
		while (p != NULL)
		{
			cout << p->data;
			if (top < 30)
			{
				stack[top + 1] = p;
				top++;
			}
			else
			{
				cout << "Stack is full!" << endl;
				return;
			}
			p = p->lchild;
		}

		if (top < 0) return;
		else
		{
			top--;
			p = stack[top + 1];
			p = p->rchild;
		}
	}
}


void PostOrder_2(BTree BT)
{
	Stack s[30];
	BTree p;
	int top, sign;
	if (BT == NULL) return;
	top = -1;
	p = BT;
	while (!(p == NULL && top == -1))
	{
		if (p != NULL)
		{
			s[++top].link = p;
			s[top].flag = 1;
			p = p->lchild;
		}
		else
		{
			p = s[top].link;
			sign = s[top].flag;
			top--;
			if (sign == 1)
			{
				s[++top].link = p;
				s[top].flag = 2;
				p = p->rchild;
			}
			else
			{
				cout << p->data;
				p = NULL;
			}
		}
	}
}


void main()
{
	BTree T;
	InitBTree(T);
	cout << "InitTree completed!" << endl;
	cout << "Create Tree:" << endl;
	CreatBTree(T);
	cout << "/nPreOrder:" << endl;
	PreOrder(T);
	cout << "/nInOrder:" << endl;
	InOrder(T);
	cout << "/nPosetOrder:" << endl;
	PostOrder(T);
	cout << "/nLevelOrder:" << endl;
	LevelOrder(T);
	cout << "/nPreOrder_2:" << endl;
	PreOrder_2(T);
	cout << "/nPostOrder_2:" << endl;
	PostOrder_2(T);
	system("pause");
}
最后更新于