#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;
}
二叉樹(2)——基本操作
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.