二叉树(建立用的是返回值类型 ,前序、中序、后序 递归遍历)
#include<iostream>
#include<stack>
using namespace std;
template <class T>
struct root
{
T val;
root<T> *left;
root<T>* right;
};
template <class T>
class BiTree
{
public:
BiTree() { r = NULL; }
~BiTree() { clear(r); }
void Build() { r = BuildTree(); }//建树
void PreOrder() { PreOrder(r); }//前序
void PreOrder1(); //非递归前序
void InOrder() { InOrder(r); }//中序
void EndOrder() { EndOrder(r); }//后序
void clear() { clear(r); r = NULL;}//清空
private:
root<T>* BuildTree();
void clear(root<T>* &r1);
void PreOrder(root<T>* r);
void InOrder(root<T>* r);
void EndOrder(root<T>* r);
root<T>* r;
};
template<class T>
void BiTree<T>::clear(root<T>* &r1)
{
if (!r1) return;
clear(r1->left);
clear(r1->right);
delete r1;
}
template <class T>
root<T> * BiTree<T>::BuildTree()
{
root<T>* k;
char c;
cin >> c;
if (c == '#') return NULL;
k = new root<T>;
k->val = c;
k->left = BuildTree();
k->right = BuildTree();
return k;
}
template<class T>
void BiTree<T>::PreOrder(root<T>* r)
{
if (!r) return;
cout << r->val << " ";
PreOrder(r->left);
PreOrder(r->right);
}
template<class T>
void BiTree<T>::PreOrder1()
{
if (r == NULL) return;
stack<root<T>*> s;
root<T>* t = r;
while (t || !s.empty())
{
while(t)
{
cout << t->val << " ";
s.push(t);
t = t->left;
}
if (!s.empty())
{
t = s.top();
s.pop();
t = t->right;
}
}
}
template<class T>
void BiTree<T>::InOrder(root<T>* r)
{
if (!r) return;
InOrder(r->left);
cout << r->val << " ";
InOrder(r->right);
}
template<class T>
void BiTree<T>::EndOrder(root<T>* r)
{
if (!r) return;
EndOrder(r->left);
EndOrder(r->right);
cout << r->val << " ";
}
int main()
{
BiTree<char> r;
r.Build();
r.PreOrder();
cout << endl;
r.PreOrder1();
cout << endl;
//r.InOrder();
//cout << endl;
//r.EndOrder();
//cout << endl;
//abc##d##e##
return 0;
}
因篇幅问题不能全部显示,请点此查看更多更全内容