二叉树的实现(链式的实现)
#include <iostream>
#include <cstdio>
#include <string>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
struct BTreeNode
{
int date = 0;
BTreeNode *left;
BTreeNode *right;
};
class BTree {
public:
BTree() {
}
void create(BTreeNode* &Node)
{
int date;
cin >> date;
if ( date )
{
Node = new BTreeNode;
Node->date = date;
create(Node->left);
create(Node->right);
}
else {
Node = NULL;
}
}
void levelBTreeNode(BTreeNode * & Node)
{
queue <BTreeNode*> q;
int date = 0;
cin >> date;
if (date)
{
Node = new BTreeNode;
Node->date = date;
q.push(Node);
}
else {
Node = NULL;
return;
}
while (!q.empty())
{
BTreeNode *node = q.front();
q.pop();
cin >> date;
if (date)
{
node -> left = new BTreeNode;
node->left->date = date;
q.push(node -> left);
}
else {
node->left = NULL;
}
cin >> date;
if (date)
{
node->right = new BTreeNode;
node->right->date = date;
q.push(node->right);
}
else {
node->right = NULL;
}
}
}
void clear( BTreeNode* & Node )
{
BTreeNode *p = Node;
if (p != NULL)
{
clear(p->left);
clear(p->right);
delete p;
}
}
void preorderTree(BTreeNode* Node)
{
if (Node != NULL)
{
cout << Node->date << " ";
preorderTree(Node->left);
preorderTree(Node->right);
}
}
void inorderTree(BTreeNode* Node)
{
if (Node != NULL)
{
inorderTree(Node->left);
cout << Node->date << " ";
inorderTree(Node->right);
}
}
void postorderTree(BTreeNode* Node)
{
if (Node != NULL)
{
postorderTree(Node->left);
postorderTree(Node->right);
cout << Node->date << " ";
}
}
void levelTree(BTreeNode* Node)
{
queue <BTreeNode*> que;
que.push(Node)
while(!que.empty())
{
BTreeNode* node = que.front();
cout << node->date << " ";
que.pop();
if (node->left != NULL) que.push(node->left);
if (node->right != NULL) que.push(node->right);
}
}
int lenthofTree(BTreeNode* Node)
{
if (Node != NULL)
{
return max(lenthofTree(Node->left), lenthofTree(Node->right)) + 1;
}
else {
return 0;
}
}
int getNodeNum(BTreeNode * Node)
{
if (Node != NULL)
{
return 1 + getNodeNum(Node->left) + getNodeNum(Node->right);
}
else {
return 0;
}
}
int getLeafNum(BTreeNode * Node)
{
if (Node == NULL) return 0;
else {
if (Node->left == NULL && Node->right == NULL)
{
return 1;
}
else {
return getLeafNum(Node->left) + getLeafNum(Node->right);
}
}
}
};
int main ()
{
BTree tree;
BTreeNode * root;
tree.levelBTreeNode(root);
cout << "pre:";
tree.preorderTree(root);
cout << endl;
cout << "in:";
tree.inorderTree(root);;
cout << endl;
cout << "post:";
tree.postorderTree(root);
cout << endl;
cout << "level:";
tree.levelTree(root);
cout << endl;
cout << tree.lenthofTree(root) << tree.getNodeNum(root) << tree.getLeafNum(root) << endl;
tree.clear(root);
return 0;
}