# Flatten a binary tree into linked list | Set-2

• Difficulty Level : Medium
• Last Updated : 27 Oct, 2021

Given a binary tree, flatten it into a linked list. After flattening, the left of each node should point to NULL and right should contain next node in level order.

Example:

```Input:
1
/   \
2     5
/ \     \
3   4     6

Output:
1
\
2
\
3
\
4
\
5
\
6

Input:
1
/ \
3   4
/
2
\
5
Output:
1
\
3
\
4
\
2
\
5```

Approach: An approach using recursion has already been discussed in the previous post. A pre-order traversal of the binary tree using stack has been implied in this approach. In this traversal, every time a right child is pushed in the stack, the right child is made equal to the left child and left child is made equal to NULL. If the right child of the node becomes NULL, the stack is popped and the right child becomes the popped value from the stack. The above steps are repeated until the size of the stack is zero or root is NULL.

Below is the implementation of the above approach:

## C++

 `// C++ program to flatten the linked ` `// list using stack | set-2 ` `#include ` `#include ` `using` `namespace` `std;`   `struct` `Node {` `    ``int` `key;` `    ``Node *left, *right;` `};`   `/* utility that allocates a new Node ` `   ``with the given key  */` `Node* newNode(``int` `key)` `{` `    ``Node* node = ``new` `Node;` `    ``node->key = key;` `    ``node->left = node->right = NULL;` `    ``return` `(node);` `}`   `// To find the inorder traversal` `void` `inorder(``struct` `Node* root)` `{` `    ``// base condition` `    ``if` `(root == NULL)` `        ``return``;` `    ``inorder(root->left);` `    ``cout << root->key << ``" "``;` `    ``inorder(root->right);` `}`   `// Function to convert binary tree into` `// linked list by altering the right node` `// and making left node point to NULL` `Node* solution(Node* A)` `{`   `    ``// Declare a stack` `    ``stack st;` `    ``Node* ans = A;`   `    ``// Iterate till the stack is not empty` `    ``// and till root is Null` `    ``while` `(A != NULL || st.size() != 0) {`   `        ``// Check for NULL` `        ``if` `(A->right != NULL) {` `            ``st.push(A->right);` `        ``}`   `        ``// Make the Right Left and` `        ``// left NULL` `        ``A->right = A->left;` `        ``A->left = NULL;`   `        ``// Check for NULL` `        ``if` `(A->right == NULL && st.size() != 0) {` `            ``A->right = st.top();` `            ``st.pop();` `        ``}`   `        ``// Iterate` `        ``A = A->right;` `    ``}` `    ``return` `ans;` `}`   `// Driver Code` `int` `main()` `{` `    ``/*    1` `        ``/   \` `       ``2     5` `      ``/ \     \` `     ``3   4     6 */`   `    ``// Build the tree` `    ``Node* root = newNode(1);` `    ``root->left = newNode(2);` `    ``root->right = newNode(5);` `    ``root->left->left = newNode(3);` `    ``root->left->right = newNode(4);` `    ``root->right->right = newNode(6);`   `    ``// Call the function to` `    ``// flatten the tree` `    ``root = solution(root);`   `    ``cout << ``"The Inorder traversal after "` `            ``"flattening binary tree "``;`   `    ``// call the function to print` `    ``// inorder after flattening` `    ``inorder(root);` `    ``return` `0;`   `    ``return` `0;` `}`

## Java

 `// Java program to flatten the linked ` `// list using stack | set-2 ` `import` `java.util.Stack;`   `class` `GFG ` `{` `    `  `static` `class` `Node` `{` `    ``int` `key;` `    ``Node left, right;` `}`   `/* utility that allocates a new Node ` `with the given key */` `static` `Node newNode(``int` `key)` `{` `    ``Node node = ``new` `Node();` `    ``node.key = key;` `    ``node.left = node.right = ``null``;` `    ``return` `(node);` `}`   `// To find the inorder traversal` `static` `void` `inorder(Node root)` `{` `    ``// base condition` `    ``if` `(root == ``null``)` `        ``return``;` `    ``inorder(root.left);` `    ``System.out.print(root.key + ``" "``);` `    ``inorder(root.right);` `}`   `// Function to convert binary tree into` `// linked list by altering the right node` `// and making left node point to null` `static` `Node solution(Node A)` `{`   `    ``// Declare a stack` `    ``Stack st = ``new` `Stack<>();` `    ``Node ans = A;`   `    ``// Iterate till the stack is not empty` `    ``// and till root is Null` `    ``while` `(A != ``null` `|| st.size() != ``0``) ` `    ``{`   `        ``// Check for null` `        ``if` `(A.right != ``null``) ` `        ``{` `            ``st.push(A.right);` `        ``}`   `        ``// Make the Right Left and` `        ``// left null` `        ``A.right = A.left;` `        ``A.left = ``null``;`   `        ``// Check for null` `        ``if` `(A.right == ``null` `&& st.size() != ``0``)` `        ``{` `            ``A.right = st.peek();` `            ``st.pop();` `        ``}`   `        ``// Iterate` `        ``A = A.right;` `    ``}` `    ``return` `ans;` `}`   `// Driver Code` `public` `static` `void` `main(String[] args) ` `{` `    ``/* 1` `        ``/ \` `    ``2     5` `    ``/ \     \` `    ``3 4     6 */`   `    ``// Build the tree` `    ``Node root = newNode(``1``);` `    ``root.left = newNode(``2``);` `    ``root.right = newNode(``5``);` `    ``root.left.left = newNode(``3``);` `    ``root.left.right = newNode(``4``);` `    ``root.right.right = newNode(``6``);`   `    ``// Call the function to` `    ``// flatten the tree` `    ``root = solution(root);`   `    ``System.out.print(``"The Inorder traversal after "` `            ``+``"flattening binary tree "``);`   `    ``// call the function to print` `    ``// inorder after flattening` `    ``inorder(root);` `}` `}`   `// This code has been contributed by 29AjayKumar`

## Python3

 `# Python3 program to flatten the linked ` `# list using stack | set-2 ` `class` `Node:` `    `  `    ``def` `__init__(``self``, key):` `        `  `        ``self``.key ``=` `key` `        ``self``.left ``=` `None` `        ``self``.right ``=` `None` `        `  `# Utility that allocates a new Node ` `# with the given key  ` `def` `newNode(key):`   `    ``node ``=` `Node(key)` `    ``node.key ``=` `key` `    ``node.left ``=` `node.right ``=` `None` `    ``return` `(node)`   `# To find the inorder traversal` `def` `inorder(root):`   `    ``# Base condition` `    ``if` `(root ``=``=` `None``):` `        ``return` `    `  `    ``inorder(root.left)` `    ``print``(root.key, end ``=` `' '``)` `    ``inorder(root.right)`   `# Function to convert binary tree into` `# linked list by altering the right node` `# and making left node point to None` `def` `solution(A):` ` `  `    ``# Declare a stack` `    ``st ``=` `[]` `    ``ans ``=` `A` ` `  `    ``# Iterate till the stack is not empty` `    ``# and till root is Null` `    ``while` `(A !``=` `None` `or` `len``(st) !``=` `0``):` ` `  `        ``# Check for None` `        ``if` `(A.right !``=` `None``):` `            ``st.append(A.right)` ` `  `        ``# Make the Right Left and` `        ``# left None` `        ``A.right ``=` `A.left` `        ``A.left ``=` `None` ` `  `        ``# Check for None` `        ``if` `(A.right ``=``=` `None` `and` `len``(st) !``=` `0``):` `            ``A.right ``=` `st[``-``1``]` `            ``st.pop()` ` `  `        ``# Iterate` `        ``A ``=` `A.right` `        `  `    ``return` `ans` ` `  `# Driver Code` `if` `__name__``=``=``'__main__'``:` `    `  `    ``'''    1` `        ``/   \` `       ``2     5` `      ``/ \     \` `     ``3   4     6 '''` ` `  `    ``# Build the tree` `    ``root ``=` `newNode(``1``)` `    ``root.left ``=` `newNode(``2``)` `    ``root.right ``=` `newNode(``5``)` `    ``root.left.left ``=` `newNode(``3``)` `    ``root.left.right ``=` `newNode(``4``)` `    ``root.right.right ``=` `newNode(``6``)` ` `  `    ``# Call the function to` `    ``# flatten the tree` `    ``root ``=` `solution(root)` ` `  `    ``print``(``"The Inorder traversal after "` `          ``"flattening binary tree "``,` `          ``end ``=` `'')` ` `  `    ``# Call the function to print` `    ``# inorder after flattening` `    ``inorder(root)` `    `  `# This code is contributed by rutvik_56`

## C#

 `// C# program to flatten the linked ` `// list using stack | set-2 ` `using` `System;` `using` `System.Collections.Generic;`   `class` `GFG ` `{` `    ``public` `class` `Node` `    ``{` `        ``public` `int` `key;` `        ``public` `Node left, right;` `    ``}`   `    ``/* utility that allocates a new Node ` `    ``with the given key */` `    ``static` `Node newNode(``int` `key)` `    ``{` `        ``Node node = ``new` `Node();` `        ``node.key = key;` `        ``node.left = node.right = ``null``;` `        ``return` `(node);` `    ``}`   `    ``// To find the inorder traversal` `    ``static` `void` `inorder(Node root)` `    ``{` `        ``// base condition` `        ``if` `(root == ``null``)` `            ``return``;` `        ``inorder(root.left);` `        ``Console.Write(root.key + ``" "``);` `        ``inorder(root.right);` `    ``}`   `    ``// Function to convert binary tree into` `    ``// linked list by altering the right node` `    ``// and making left node point to null` `    ``static` `Node solution(Node A)` `    ``{`   `        ``// Declare a stack` `        ``Stack st = ``new` `Stack();` `        ``Node ans = A;`   `        ``// Iterate till the stack is not empty` `        ``// and till root is Null` `        ``while` `(A != ``null` `|| st.Count != 0) ` `        ``{`   `            ``// Check for null` `            ``if` `(A.right != ``null``) ` `            ``{` `                ``st.Push(A.right);` `            ``}`   `            ``// Make the Right Left and` `            ``// left null` `            ``A.right = A.left;` `            ``A.left = ``null``;`   `            ``// Check for null` `            ``if` `(A.right == ``null` `&& st.Count != 0)` `            ``{` `                ``A.right = st.Peek();` `                ``st.Pop();` `            ``}`   `            ``// Iterate` `            ``A = A.right;` `        ``}` `        ``return` `ans;` `    ``}`   `    ``// Driver Code` `    ``public` `static` `void` `Main(String[] args) ` `    ``{` `        ``/* 1` `          ``/ \` `         ``2     5` `        ``/ \     \` `        ``3 4     6 */`   `        ``// Build the tree` `        ``Node root = newNode(1);` `        ``root.left = newNode(2);` `        ``root.right = newNode(5);` `        ``root.left.left = newNode(3);` `        ``root.left.right = newNode(4);` `        ``root.right.right = newNode(6);`   `        ``// Call the function to` `        ``// flatten the tree` `        ``root = solution(root);`   `        ``Console.Write(``"The Inorder traversal after "` `                ``+``"flattening binary tree "``);`   `        ``// call the function to print` `        ``// inorder after flattening` `        ``inorder(root);` `    ``}` `}`   `// This code contributed by Rajput-Ji`

## Javascript

 ``

Output:

`The Inorder traversal after flattening binary tree 1 2 3 4 5 6`

Time Complexity: O(N)
Auxiliary Space: O(Log N)

My Personal Notes arrow_drop_up
Recommended Articles
Page :