#include <bits/stdc++.h>
using
namespace
std;
struct
Node {
int
data;
Node* left;
Node* right;
};
Node* createNewNode(
int
value)
{
Node* temp = NULL;
temp =
new
Node();
temp->data = value;
temp->left = NULL;
temp->right = NULL;
return
temp;
}
void
createStructureUtil(queue<Node*>& qu,
int
k)
{
int
num = 1;
int
level = k - 1;
while
(level--) {
int
qsize = qu.size();
while
(qsize--) {
Node* temp = qu.front();
qu.pop();
num += 1;
temp->left = createNewNode(num);
num += 1;
temp->right = createNewNode(num);
qu.push(temp->left);
qu.push(temp->right);
}
}
num += 1;
while
(qu.size() > 1) {
Node* first = qu.front();
qu.pop();
Node* second = qu.front();
qu.pop();
first->right
= createNewNode(first->data
+ second->data);
second->left = first->right;
qu.push(first->right);
}
}
void
printLevelOrder(Node* root,
int
k)
{
if
(root == NULL)
return
;
queue<Node*> qu;
qu.push(root);
int
level = k - 1;
while
(level--) {
int
qsize = qu.size();
while
(qsize--) {
Node* temp = qu.front();
qu.pop();
cout << temp->data <<
" "
;
if
(temp->left != NULL)
qu.push(temp->left);
if
(temp->right != NULL)
qu.push(temp->right);
}
cout << endl;
}
while
(qu.size() > 1) {
int
qsize = qu.size();
while
(qsize) {
Node* first = qu.front();
qu.pop();
Node* second = qu.front();
qu.pop();
cout << first->data <<
" "
<< second->data <<
" "
;
qu.push(first->right);
qsize = qsize - 2;
}
cout << endl;
}
Node* first = qu.front();
qu.pop();
cout << first->data << endl;
}
void
createStructure(
int
k)
{
queue<Node*> qu;
Node* root = createNewNode(1);
qu.push(root);
createStructureUtil(qu, k);
printLevelOrder(root, k);
}
int
main()
{
int
k = 4;
createStructure(k);
}