#include<stdio.h>
#include<stdlib.h>
#include<stack>
#include<queue>
using namespace std;
struct Data
{
int id;
};
struct Node
{
Data data;
bool isprint = 0;
Node* left;
Node* right;
Node* prev;
};
stack <Node> s;
struct BinTree
{
bool isEmpty()
{
if (head)
{
return 0;
}
else
{
return 1;
}
}
void Insert(Data* data)
{
if (!head)
{
Node* temp = new Node();
temp->data = *data;
temp->left = NULL;
temp->right = NULL;
head = temp;
deep++;
ct_node++;
return;
}
flag = 0;
Preorder_traversal(this->head);
Node* temp = new Node();
temp->data = *data;
temp->left = NULL;
temp->right = NULL;
if (this->now->left)
{
this->now->right = temp;
ct_node++;
int max_node = pow(2, deep) - 1;
if (ct_node >= max_node)
{
deep++;
}
}
else
{
this->now->left = temp;
ct_node++;
int max_node = pow(2, deep) - 1;
if (ct_node >= max_node)
{
deep++;
}
}
}
void Preorder_traversal(Node* now,int mydeep=1)
{
if (deep == 0||deep == 1)
{
this->now = head;
return;
}
else if (!now)
{
return;
}
else
{
if (!flag&&mydeep == deep - 1 && (((now->left == NULL) && (now->right == NULL)) || ((now->left) && (now->right == NULL))))
{
this->now = now;
flag = 1;
}
Preorder_traversal(now->left, mydeep + 1);
Preorder_traversal(now->right, mydeep + 1);
}
}
void Preorder_traversal_print(Node* now)
{
if (!now)
return;
else
{
printf("%d ", now->data.id);
Preorder_traversal_print(now->left);
Preorder_traversal_print(now->right);
}
}
void Inorder_traversal(Node* now)
{
if (!now)
return;
else
{
Inorder_traversal(now->left);
printf("%d ", now->data.id);
Inorder_traversal(now->right);
}
}
void Postorder_traversal(Node* now)
{
if (!now)
return;
else
{
Postorder_traversal(now->left);
Postorder_traversal(now->right);
printf("%d ", now->data.id);
}
}
void Preorder_traversal()
{
if (head)
{
Node* now = head;
while (s.size())
s.pop();
while (now||!s.empty())
{
while (now)
{
printf("%d ", now->data.id);
s.push(*now);
now = now->left;
}
now = s.top().right;
s.pop();
}
}
else
{
return;
}
}
void Inorder_traversal()
{
if (head)
{
Node* now = head;
while (s.size())
s.pop();
while (now || !s.empty())
{
for (; now; now = now->left)
{
s.push(*now);
}
now = &s.top();
printf("%d ", now->data.id);
s.pop();
now = now->right;
}
}
else
{
return;
}
}
void Postorder_traversal()
{
if (head)
{
Node* now = head;
while (!s.empty())
{
s.pop();
}
while (now || !s.empty())
{
for (; now; now = now->left)
{
s.push(*now);
}
while (s.top().isprint)
{
now = &s.top();
printf("%d ", now->data.id);
s.pop();
if (s.empty())
goto tql;
}
now = &s.top();
s.pop();
now->isprint = 1;
s.push(*now);
now = now->right;
}
tql:now=now;
}
else
{
return;
}
}
void level_traversal()
{
queue <Node> q;
now = head;
q.push(*head);
if (head)
{
while (1)
{
Node temp = q.front();
printf("%d ", temp.data.id);
q.pop();
if (temp.left)
{
q.push(*temp.left);
}
if (temp.right)
{
q.push(*temp.right);
}
if (q.empty())
{
break;
}
}
}
else
{
return;
}
}
Data data;
int deep = 0;
int flag = 0;
Node* head;
Node* now;
int ct_node = 0;
};
int main()
{
BinTree* bintree = new BinTree();
Data data;
for (int i = 1; i <= 14; i++)
{
data.id = i;
bintree->Insert(&data);
}
bintree->Preorder_traversal_print(bintree->head);
printf("\n");
bintree->Inorder_traversal(bintree->head);
printf("\n");
bintree->Postorder_traversal(bintree->head);
printf("\n");
bintree->Preorder_traversal();
printf("\n");
bintree->Inorder_traversal();
printf("\n");
bintree->Postorder_traversal();
printf("\n");
bintree->level_traversal();
printf("\n");
system("pause");
}