#include <iostream>
using namespace std;
struct BiNode
{
char data;
BiNode* lchild, * rchild;
};
class BiTree
{
public:
BiTree()
{
count = 0;
root = Creat();
}
~BiTree()
{
Release(root);
}
void PreOrder()
{
PreOrder(root);
}
void InOrder()
{
InOrder(root);
}
void PostOrder()
{
PostOrder(root);
}
void LevelOrder()
{
LevelOrder(root);
}
void getcount() //求二叉树中结点个数
{
if (count == 0)
{
cout << "NULL";
}
else
{
cout << count;
}
}
private:
BiNode* Creat();
BiNode* root;
int count;
void Release(BiNode* bt);
void PreOrder(BiNode* bt);
void InOrder(BiNode* bt);
void PostOrder(BiNode* bt);
void LevelOrder(BiNode* bt);
};
void BiTree::PreOrder(BiNode* bt)
{
if (bt == NULL) return;
else
{
cout << bt->data << " ";
PreOrder(bt->lchild);
PreOrder(bt->rchild);
}
}
void BiTree::InOrder(BiNode* bt)
{
if (bt == NULL) return;
else
{
InOrder(bt->lchild);
cout << bt->data << " ";
InOrder(bt->rchild);
}
}
void BiTree::PostOrder(BiNode* bt)
{
if (bt == NULL) return;
else
{
PostOrder(bt->lchild);
PostOrder(bt->rchild);
cout << bt->data << " ";
}
}
void BiTree::LevelOrder(BiNode* bt)
{
BiNode* Q[100], * q = NULL;
int front = -1, rear = -1;
if (root == NULL) return;
Q[++rear] = root; //根指针入队
while (front != rear)
{
q = Q[++front]; //出队
cout << q->data << " ";
if (q->lchild != NULL) Q[++rear] = q->lchild;
if (q->rchild != NULL) Q[++rear] = q->rchild;
}
}
BiNode* BiTree::Creat()
{
BiNode* bt;
char ch;
cin >> ch;
if (ch == '#') bt = NULL;
else
{
count++;
bt = new BiNode;
bt->data = ch;
bt->lchild = Creat();
bt->rchild = Creat();
}
return bt;
}
void BiTree::Release(BiNode* bt)
{
if (bt == NULL) return;
else
{
Release(bt->lchild);
Release(bt->rchild);
delete bt;
}
}
int main()
{
BiTree T;
T.getcount();
return 0;
}