数据结构--二叉树(链式存储)C++(模板类实现)
作者:
AmbitionX
,
2022-05-07 09:30:57
,
所有人可见
,
阅读 230
#include <iostream>
using namespace std;
template <typename DataType>
struct BiNode
{
DataType data;
BiNode<DataType> * lchild, * rchild;
};
template <typename DataType>
class BiTree
{
public:
BiTree( ){root = Creat();}
~BiTree( ){Release(root);}
void PreOrder( ){PreOrder(root);}
void InOrder( ){InOrder(root);}
void PostOrder( ){PostOrder(root);}
void LevelOrder( );
private:
BiNode<DataType> *Creat();
void Release(BiNode<DataType> *bt);
void PreOrder(BiNode<DataType> *bt);
void InOrder(BiNode<DataType> *bt);
void PostOrder(BiNode<DataType> *bt);
BiNode<DataType> * root;
};
template <typename DataType>
BiNode<DataType> * BiTree<DataType> :: Creat()
{
BiNode<DataType> * bt;
char ch;
cin >> ch;
if (ch == '#') bt = nullptr;
else if (ch == '!') return bt;
else
{
bt = new BiNode<DataType>;
bt->data = ch;
bt->lchild = Creat();
bt->rchild = Creat();
}
return bt;
}
template <typename DataType>
void BiTree<DataType> :: Release(BiNode<DataType> * bt)
{
if (bt == nullptr) return;
else
{
Release(bt->lchild);
Release(bt->rchild);
delete bt;
}
}
template <typename DataType>
void BiTree<DataType> :: PreOrder(BiNode<DataType> * bt)
{
if (bt == nullptr) return;
else
{
cout << bt->data << "\t";
PreOrder(bt->lchild);
PreOrder(bt->rchild);
}
}
template <typename DataType>
void BiTree<DataType> :: InOrder(BiNode<DataType> * bt)
{
if (bt == nullptr) return;
else
{
InOrder(bt->lchild);
cout << bt->data << "\t";
InOrder(bt->rchild);
}
}
template <typename DataType>
void BiTree<DataType> :: PostOrder(BiNode<DataType> * bt)
{
if (bt == nullptr) return;
else
{
PostOrder(bt->lchild);
PostOrder(bt->rchild);
cout << bt->data << "\t";
}
}
template <typename DataType>
void BiTree<DataType> :: LevelOrder()
{
BiNode<DataType> * Q[100], *q = nullptr;
int front = -1, rear = -1;
if (root == nullptr) return;
Q[++ rear] = root;
while (front != rear)
{
q = Q[++ front];
cout << q->data << "\t";
if (q->lchild != nullptr) Q[++ rear] = q->lchild;
if (q->rchild != nullptr) Q[++ rear] = q->rchild;
}
}
int main()
{
BiTree<char> T{ };
cout << "二叉树的前序遍历是 " << endl;
T.PreOrder();
cout << endl;
cout << "二叉树的中序遍历是 " << endl;
T.InOrder();
cout << endl;
cout << "二叉树的后序遍历是 " << endl;
T.PostOrder();
cout << endl;
cout << "二叉树的层序遍历是 " << endl;
T.LevelOrder();
cout << endl;
return 0;
}