二叉链表
二叉链表:二叉树的每个结点对应一个链表
结点,链表结点存放结点的数据信息和指示
左右孩子的指针
储存结构定义
template <typename DataType> struct
BiNode
{
DataType data;
BiNode< DataType > *lchild, *rchild;
};
数据类型定义
template <typename DataType>
class BiTree
{
public:
BiTree( ){root = Creat(root);}
~BiTree( ){Release(root);}
void PreOrder( ){PreOrder(root);}
void InOrder( ){InOrder(root);}
void PostOrder( ){PostOrder(root);}
void LeverOrder( );
private:
BiNode<DataType> *Creat(BiNode<DataType> *bt);
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>
void BiTree<DataType> :: PreOrder(BiNode<DataType> *bt)
{
if (bt == nullptr) return; //递归调用的结束条件
else {
cout << bt->data; //访问根结点bt的数据域
PreOrder(bt->lchild); //前序递归遍历bt的左子树
PreOrder(bt->rchild); //前序递归遍历bt的右子树
} }
层序遍历
template <typename DataType>
void BiTree<DataType> :: LeverOrder( )
{
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;
if (q->lchild != nullptr) Q[++rear] = q->lchild;
if (q->rchild != nullptr) Q[++rear] = q->rchild; } }
二叉链表的建立
template <typename DataType>
BiNode<DataType> *BiTree<DataType> :: Creat(BiNode<DataType> *bt) {
char ch;
cin >> ch; //输入结点的数据信息,假设为字符
if (ch == ‘#’) bt = nullptr; //建立一棵空树
else {
bt = new BiNode<DataType>; bt->data = ch;
bt->lchild = Creat(bt->lchild); //递归建立左子树
bt->rchild = Creat(bt->rchild); //递归建立右子树
}
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; //释放根结点
} }