//Geeksun 2018.05.13
#include <iostream>
using namespace std;
struct Node
{
char data;
struct Node* firstChild;
struct Node* rightSlib;
};
class Tree
{
public:
Tree();
~Tree(){}
void Tree_creat();
struct Node* getRoot()
{
return root;
};
void preOrderTraverse(struct Node* node);
void postOrderTraverse(struct Node* node);
void levelOrderTraverse(struct Node* node);
private:
struct Node* root;
int size;
};
Tree::Tree()
{
size = 0;
root = NULL;
}
void Tree::Tree_creat()
{
struct Node* array[20];
char parent,child;
cin >> parent >> child;
while(child != '#')
{
struct Node* p = NULL;
struct Node* node = new struct Node;
node->data = child;
node->firstChild = NULL;
node->rightSlib = NULL;
if(parent == '#')
{
root = node;
}
else
{
int i = 0;
while(array[i]->data != parent&&i < size)
{
i++;
}
if(array[i]->data == parent)
{
if(array[i]->firstChild == NULL)
{
array[i]->firstChild = node;
}
else
{
p = array[i]->firstChild;
while(p->rightSlib != NULL)
{
p = p->rightSlib;
}
p->rightSlib = node;
}
}
}
array[size++] = node;
cin >> parent >> child;
}
}
void Tree::preOrderTraverse(struct Node* node)
{
if(node)
{
cout << node->data << endl;
preOrderTraverse(node->firstChild);
preOrderTraverse(node->rightSlib);
}
}
void Tree::postOrderTraverse(struct Node* node)
{
if(node)
{
postOrderTraverse(node->firstChild);
cout << node->data;
postOrderTraverse(node->rightSlib);
}
}
void Tree::levelOrderTraverse(struct Node* node)
{
struct Node *p,*q;
int head = 0,tail = 0;
struct Node* queue[20];
if(!node)
{
return;
}
queue[tail++] = node;
while(head != tail)
{
p = queue[head++];
cout << p->data;
for(q = p->firstChild;q;q = q->rightSlib)
{
queue[tail++] = q;
}
}
}
int main()
{
Tree myTree;
myTree.Tree_creat();
myTree.preOrderTraverse(myTree.getRoot());
cout << endl;
myTree.levelOrderTraverse(myTree.getRoot());
return 0;
}
输入格式:
#a ab ac ad be bf bg ch di ej hk ##
//每个的第一个表示父节点,第二个表示子节点。