#include <iostream>
using namespace std;
typedef struct Tree
{
char data1;
struct Tree *lchild, *rchild;
}Tree;
template<typename T>
struct Node
{
T data;
Node<T>* next;
};
template<typename T>
class stack
{
Node<T>* top;
public:
stack() :top(NULL){}
void push(T n);
T pop();
bool stackEmpty();
T getTop();
~stack(){}
void print();
};
template<typename T>
void stack<T>::push(T n)
{
Node<T>* r = new Node<T>;
r->data = n;
r->next = top;
top = r;
}
template<typename T>
T stack<T>::pop()
{
Node<T> *ptr = top;
top = top->next;
T t = ptr->data;
delete ptr;
return t;
}
template<typename T>
void stack<T>::print()
{
for (Node<T>* p = top; p; p = p->next)
cout << p->data << " ";
}
template<typename T>
T stack<T>::getTop()
{
return top->data;
}
template<typename T>
bool stack<T>::stackEmpty()
{
if (top)return false;
else return true;
}
//////////////////////////////////////////////
void firstPutTree(Tree* &T)
{//用我自己的模板栈实现的 先序 遍历
stack<Tree*> s;
Tree* p = T;
Tree* q;
for (; p || !s.stackEmpty();)
{
if (p)
{
s.push(p);
p = p->lchild;
cout << s.getTop()->data1;
}
else
{
q = s.pop();
p = q->rchild;
}
}
}
void lastPutTree(Tree* &T)
{//用我自己的模板栈实现的 后序 遍历
stack<Tree*> s;
Tree* p = T;
Tree* q;
for (; p || !s.stackEmpty();)
{
if (p)
{
s.push(p);
p = p->lchild;
}
else
{
q = s.pop();
if ((p = q->rchild) == NULL)
cout << q->data1;
}
}
}
void midPutTree(Tree* &T)
{//用我自己的模板栈实现的 中序 遍历
stack<Tree*> s;
Tree* p = T;
Tree* q;
for (; p || !s.stackEmpty();)
{
if (p)
{
s.push(p);
p = p->lchild;
}
else
{
q = s.pop();
cout << q->data1;
p = q->rchild;
}
}
}
/*
void firstPutTree(Tree* T)
{
if(T)
{
firstPutTree(T->lchild);
cout<<T->data<<" ";
firstPutTree(T->rchild);
}
}*/
void firstCreateTree(Tree* &T)
{//先序创建
char ch;
cin >> ch;
if (ch == '#')T = NULL;
else
{
T = new Tree;
T->data1 = ch;
firstCreateTree(T->lchild);
firstCreateTree(T->rchild);
}
}
void midCreateTree(Tree* &T)
{//中序创建
char ch;
cin >> ch;
if (ch == '#')T = NULL;
else
{
T = new Tree;
midCreateTree(T->lchild);
T->data1 = ch;
midCreateTree(T->rchild);
}
}
void lastCreateTree(Tree* &T)
{//后序创建
char ch;
cin >> ch;
if (ch == '#')T = NULL;
else
{
T = new Tree;
lastCreateTree(T->lchild);
lastCreateTree(T->rchild);
T->data1 = ch;
}
}
void copy(Tree* &T, Tree* &T2)
{//复制二叉树
if (T == NULL)
{
T2 = NULL;
return;
}
else
{
T2 = new Tree;
T2->data1 = T->data1;
copy(T->lchild, T2->lchild);
copy(T->rchild, T2->rchild);
}
}
int deepth(Tree* &T)
{
int m, n;
if (T == NULL)return 0;
else
{
m = deepth(T->lchild);
n = deepth(T->rchild);
if (m > n)
return m + 1;
else return n + 1;
}
}
int NodeCount(Tree* &T)
{
if (T == NULL)
return 0;
else
return NodeCount(T->lchild) + NodeCount(T->rchild) +1 ;
}
int main()
{
Tree* T, *T2;
cout << "1.先序创建" << endl;
cout << "2.中序创建" << endl;
cout << "3.后序创建" << endl;
cout << "4.先序遍历" << endl;
cout << "5.中序遍历" << endl;
cout << "6.后序遍历" << endl;
cout << "7.复制" << endl;
cout << "8.深度" << endl;
cout << "9.结点" << endl;
int i;
cin >> i;
for (; i != 0;)
{
switch (i)
{
case 1:firstCreateTree(T); break;
case 2:midCreateTree(T); break;
case 3:lastCreateTree(T); break;
case 4:firstPutTree(T); break;
case 5:midPutTree(T2); break;
case 6:lastPutTree(T); break;
case 7:copy(T, T2); break;
case 8:cout<<deepth(T); break;
case 9:cout << NodeCount(T); break;
}
cout << endl << "which : ";
cin >> i;
}
}