二叉樹(2)——基本操作

#include<iostream>
using namespace std;
const int step=20;
//二叉鏈表
struct BiTree
{
	char data;
	struct BiTree *LChild,*RChild;
};
//棧
struct Stack
{
	struct BiTree *base;
	struct BiTree *top;
	int stacksize;
};
//初始化棧
void InitStack(struct Stack &s)
{
	s.base=(struct BiTree*)malloc(step*sizeof(struct BiTree));
	if(!s.base)
		exit(1);
	s.top=s.base;
	s.stacksize=step;
}
//壓棧
void push(struct Stack &S,struct BiTree T)
{
	if(S.top-S.base>=S.stacksize)
	{
		S.base=(struct BiTree*)realloc(S.base,(S.stacksize+step)*sizeof(struct BiTree));
		if(!S.base)
			exit(1);
		S.top=S.base+S.stacksize;
		S.stacksize+=step;
	}
	*S.top++=T;
}
//出棧
void pop(struct Stack& S,struct BiTree &T)
{
	if(S.top==S.base)
		return;
	T=*--S.top;
}
//獲取棧頂元素
bool GetTop(struct Stack S,struct BiTree &T)
{
	if(S.top==S.base)
		return false;
	T=*(S.top-1);
	return true;
}
//判斷棧是否爲空
bool EmptyStack(struct Stack s)
{
	if (s.base==s.top)
	{
		return true;
	}
	return false;
}
//建立二叉樹
void   CreateBiTree(struct BiTree* &T)
{
	char data;
	cin>>data;
	if (data=='#')
	{
		T=NULL;
	}
	else
	{
		T=new struct BiTree;
		T->data=data;
		CreateBiTree(T->LChild);
		CreateBiTree(T->RChild);
	} 
}
//先序
void   PreOrderTraverse(struct BiTree *T)
{
	if (T)
	{
		printf("%c\n",T->data);
		PreOrderTraverse(T->LChild);
		PreOrderTraverse(T->RChild);
	}
}
//中序
//中序建立待考證
/*void CreateBiTreeByInOrder(struct BiTree* &T)
{
	char data;
	cin>>data;
	if (data=='#')
	{
		T=NULL;
	}
	else
	{
		
		CreateBiTreeByInOrder(T->LChild);
		T=new struct BiTree;
		T->data=data;
		CreateBiTreeByInOrder(T->RChild);
	} 
}*/
void InOrderTraverse(struct BiTree* T)
{
	if (T)
	{
		InOrderTraverse(T->LChild);
		printf("%c\n",T->data);
		InOrderTraverse(T->RChild);
	}
}

//非遞歸中序——空指針進棧
//此函數空節點入棧存在問題
/*void NNInOrderTraverse(struct BiTree *T)
{
	struct BiTree *P=T;
	struct Stack S;
	InitStack(S);
	push(S,*P);
	while (!EmptyStack(S))
	{
		while (GetTop(S,*P) && P!=NULL)
		{
			push(S,*P->LChild);
			P=P->LChild;
		}
		pop(S,*P);
		if (!EmptyStack(S))
		{
			pop(S,*P);
			printf("%c\n",P->data);
			push(S,*P->RChild);
		}
	}
}*/
//空指針不進棧
void NInOrderTraverse(struct BiTree *T)
{
	struct BiTree *P=T;
	struct Stack S;
	InitStack(S); 
	while (P||!EmptyStack(S))
	{
		if (P)
		{
			push(S,*P);
			P=P->LChild;
		}
		else 
		{
			P=(struct BiTree*)malloc(sizeof(struct BiTree));
			pop(S,*P);
			printf("%c\n",P->data);
			P=P->RChild;
		}
	}
}
//後序遍歷
void PostOrderTraverse(struct BiTree*T)
{
	if(T)
	{
		PostOrderTraverse(T->LChild);
		PostOrderTraverse(T->RChild);
		printf("%c\n",T->data);
	}
}
 
int main()
{
	struct BiTree *T;
	CreateBiTree(T); 
	//PreOrderTraverse(T);
	//InOrderTraverse(T);
	//PostOrderTraverse(T);
	NInOrderTraverse(T);
	return 0;
}


發佈了34 篇原創文章 · 獲贊 5 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章