Linked List Tree

/*
Assuming struct definition:

template<class T>
class Node
{
public:
    explicit Node(T a) :
        value{ a },
        next{ nullptr },
        left{ nullptr },
        right{ nullptr } {}

    T value;
    Node *left;
    Node *right;
    Node *next;
};

*/

/*
The Algorithm:
- Implementing a regular BFS is sufficient in printing out a level order 
  traveral in a tree. Our goal here is to distinguish when a new line is
  meet. 
- We can infer a new line in the tree with a nullptr, when will denote 
  the end of a linked list.
- We note a new line in the instance that we've just uncovered a newline
  and that the next element in the queue is not a new line. Consider the 
  tree:

            4
       2        6
    1    3    5    7

- In a level order traversal, we either can add a maximum of 2 nodes in the
  queue for a binary tree. As the base case, we push in the root and then
  the nullptr.
- Then, 2 additional nodes are inserted. The next element in the queue will
  be a nullptr. Which will denote the insertion of an additional nullptr.
- Before we can insert another nullptr, we 2 and 6 are both in the queue and will
  insert 4 elements before the next incoming nullptr.


Consider a more complex example:

                4
            8        3
        4                6
    8        3

- In the first enqueue after the root are 3 elements. 8, 3, and a nullptr.
- 8 will have the opportunity to enqueue 4, just one element.
- After 8 gets popped off 3 is next and enqueues 6.
- Now our queue is: nullptr, 4,6
- nullptr enqueues another nullptr, and our queue becomes 4,6,nullptr.
- Notice that the queue will always respond with the number of children
  that were inserted of each parent node. A nullptr will only be expressed when
  the previous parent sufficiently had the opportunity to place its children
  into the queue.

*/

template<typename T>
class B_tree
{
public:
    static void connect_linked_list(Node<T> *root)
    {
        if (!root) return;

        queue<Node<T>*> q;
        q.push(root);
        q.push(nullptr);

        while (!q.empty()) {
            Node<T> *temp = q.front();
            q.pop();

            if (temp) {
                temp->next = q.front();

                if (temp->left)
                    q.push(temp->left);
                if (temp->right)
                    q.push(temp->right);

            }
            else {
                if (!q.empty() && q.front())
                    q.push(nullptr);
            }
        }
    }

    static void print_level_order(Node<T> *root)
    {
        if (root) {
            Node<T> *iter = root;
            while (iter) {
                cout << iter->value << ' ';
                iter = iter->next;
            }
            cout << endl;
            if (root->left) {
                print_level_order(root->left);
            }
            else if (root->right) {
                print_level_order(root->right);
            }
        }
    }

private:


};

/*
Testing:
B_tree<int>::connect_linked_list(tree->root);
B_tree<int>::print_level_order(tree->root);
*/

Last updated