#include <iostream>
#include <cstdlib>
using namespace std;
const int Size=5;
const int Increment=10;
typedef char Element;
typedef struct BiTNdoe
{
Element date;
BiTNdoe* lchild;
BiTNdoe* rchild;
}BiTNdoe,*BiTree;
//模板类
template<class T>
class Stack
{
public:
Stack(); //构造函数
T Pop(); //出栈
T GetTop(); //获得栈顶的元数
bool Push(T e); //入栈
bool IsEmpty(); //是否为空
~Stack(); //析构函数
private:
int size;
T* top;
T* base;
};
//创建二叉树
void CreateBiTree(BiTree* T)
{
Element c;
cin >> c;
if('#'==c)
{
(*T)=NULL;
}
else
{
(*T)=(BiTNdoe*)malloc(sizeof(BiTNdoe));
(*T)->date=c;
CreateBiTree(&(*T)->lchild); //递归创建左子树
CreateBiTree(&(*T)->rchild); //递归创建右子树
}
}
//具体的访问细节
void Visit(Element date)
{
printf("%c \n",date);
}
template<class T>
Stack<T>::Stack()
{
base=(T*)malloc(sizeof(T)*Size);
if(!base)
{
cout << "内存分配失败" << endl;
exit(OVERFLOW);
}
top=base;
size=Size;
}
template<class T>
T Stack<T>:: Pop()
{
if(top-base<=0)
{
cout << "栈内已经没有数据!" <<endl;
exit(1);
}
return *(--top);
}
template<class T>
T Stack<T>:: GetTop()
{
if(IsEmpty())
{
cout << "栈内已经没有数据!" <<endl;
exit(1);
}
return *(top-1);
}
template<class T>
bool Stack<T>:: Push(T e)
{
if(IsFull())
{
T* p=(T*)realloc(base,(size+Increment)*sizeof(T));
if(!p)
{
cout << "内存分配失败" << endl;
exit(OVERFLOW);
}
base=p;
top=base+size;
size+=Increment;
}
*(top++)=e;
return true;
}
template<class T>
bool Stack<T>:: IsEmpty()
{
if(top==base)
return true;
else
return false;
}
template<class T>
Stack<T>:: ~Stack()
{
delete [] base;
}
//前序非递归遍历
void preTraversal(BiTree T)
{
Stack<BiTNdoe> stack;
BiTree p=T;
while(p || ! stack.IsEmpty())
{
while(p)
{
Visit(p->date);
stack.Push(*p);
p=p->lchild;
}
p=&stack.Pop();
p=p->rchild;
}
}
//测试代码
int main()
{
BiTree T;
CreateBiTree(&T);
preTraversal(T);
return 0;
}
二叉树的非递归遍历
最新推荐文章于 2022-10-14 17:01:51 发布