Given the linked list representation of a complete binary tree. The linked list is in the order of level order traversal of the tree. Write an algorithm to construct the complete binary tree back from its linked list representation.
Table of Contents
Example
Input
1 -> 2 -> 3 -> 4 -> 5
Output
In-order traversal
4 2 5 1 3
Algorithm for Construct Complete Binary Tree
A complete binary tree is a binary tree that has all the levels completely filled except for the last level and all the nodes in the last level are as left as possible. Also, when a complete tree is represented through an array a node at index i in the array has its left child at index (2 * i + 1) and right child at index (2 * i + 2). We can visualize the same thing in the linked list representation.
So the children of node at index 0 are present at index 1 and 2, children of node at index 1 are present at index 3 and 4, and so on.
The idea to convert the linked list representation to the tree is that the first node of the linked list is always the root of the tree. So we push the root in a queue, we do a BFS on the tree and simultaneously traverse in the linked list to convert it into the tree. For every node in the tree, we traverse two nodes in the linked list, one for the left child and one for the right child.
- Create a queue, say q.
- Push the head of the linked list to the queue.
- While the end of the linked list is not reached, repeat step 4.
- Remove a node from the queue, let it be the parent. Traverse in the list, the first node is the left child of the parent, and second node is the right child of the parent. Also, enqueue the left and right child to the queue.
JAVA Code for Construct Complete Binary Tree
import java.util.LinkedList; import java.util.Queue; public class ConstructCompleteBinaryTreeFromItsLinkedListRepresentation { // class representing node of a linked list static class ListNode { int data; ListNode next; public ListNode(int data) { this.data = data; } } // class representing node of a binary tree static class TreeNode { int data; TreeNode left, right; public TreeNode(int data) { this.data = data; } } // function to print inorder traversal of a tree private static void inorder(TreeNode root) { if (root != null) { inorder(root.left); System.out.print(root.data + " "); inorder(root.right); } } private static void constructCompleteBinaryTree(ListNode head) { if (head == null) { return; } // initialize root of the tree as head of linked list TreeNode root = new TreeNode(head.data); // create a queue Queue<TreeNode> q = new LinkedList<>(); // push the root of the tree to the queue q.add(root); while (head != null) { // remove an element from the queue TreeNode parent = q.poll(); // traverse in linked list head = head.next; if (head != null) { // this node of linked list is the left child of parent TreeNode leftChild = new TreeNode(head.data); parent.left = leftChild; // add left child to the queue q.add(leftChild); // traverse in linked list head = head.next; if (head != null) { // this node of the linked list is the right child of parent TreeNode rightChild = new TreeNode(head.data); parent.right = rightChild; // add right child to the queue q.add(rightChild); } } } // print inorder traversal of the tree System.out.println("Inorder Traversal"); inorder(root); System.out.println(); } public static void main(String[] args) { // Example ListNode head = new ListNode(1); head.next = new ListNode(2); head.next.next = new ListNode(3); head.next.next.next = new ListNode(4); head.next.next.next.next = new ListNode(5); constructCompleteBinaryTree(head); } }
Inorder Traversal 4 2 5 1 3
C++ Code for Construct Complete Binary Tree
#include <bits/stdc++.h> using namespace std; // class representing node of a linked list class ListNode { public: int data; ListNode *next; ListNode(int d) { data = d; next = NULL; } }; // class representing node of a binary tree class TreeNode { public: int data; TreeNode *left; TreeNode *right; TreeNode(int d) { data = d; left = right = NULL; } }; // function to print inorder traversal of a tree void inorder(TreeNode *root) { if (root != NULL) { inorder(root->left); cout<<root->data<<" "; inorder(root->right); } } void constructCompleteBinaryTree(ListNode *head) { if (head == NULL) { return; } // initialize root of the tree as head of linked list TreeNode *root = new TreeNode(head->data); // create a queue queue<TreeNode *> q; // push the root of the tree to the queue q.push(root); while (head != NULL) { // remove an element from the queue TreeNode *parent = q.front(); q.pop(); // traverse in linked list head = head->next; if (head != NULL) { // this node of linked list is the left child of parent TreeNode *leftChild = new TreeNode(head->data); parent->left = leftChild; // add left child to the queue q.push(leftChild); // traverse in linked list head = head->next; if (head != NULL) { // this node of the linked list is the right child of parent TreeNode *rightChild = new TreeNode(head->data); parent->right = rightChild; // add right child to the queue q.push(rightChild); } } } // print inorder traversal of the tree cout<<"Inorder Traversal"<<endl; inorder(root); cout<<endl; } int main() { ListNode *head = new ListNode(1); head->next = new ListNode(2); head->next->next = new ListNode(3); head->next->next->next = new ListNode(4); head->next->next->next->next = new ListNode(5); constructCompleteBinaryTree(head); return 0; }
Inorder Traversal 4 2 5 1 3
Complexity Analysis
Time Complexity = O(n)
Space Complexity = O(n)
where n is the number of elements in the linked list.