-
Notifications
You must be signed in to change notification settings - Fork 1
/
Flatten_BST_to_list.cpp
105 lines (91 loc) · 2.32 KB
/
Flatten_BST_to_list.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
/*
Problem Statement:
------------------
Given a binary search tree, the task is to flatten it to a sorted list. Precisely, the value of each node must be lesser than the values of all the nodes
at its right, and its left node must be NULL after flattening. We must do it in O(H) extra space where ‘H’ is the height of BST.
Examples:
--------
Input:
5
/ \
3 7
/ \ / \
2 4 6 8
Output: 2 3 4 5 6 7 8
Input:
1
\
2
\
3
\
4
\
5
Output: 1 2 3 4 5
*/
// Link --> https://www.geeksforgeeks.org/flatten-bst-to-sorted-list-increasing-order/?web=1&wdLOR=cC00AC783-F071-4AE9-BEEB-186B13B6945B
// Code:
#include <bits/stdc++.h>
using namespace std;
class Node
{
public:
int data;
Node *left;
Node *right;
Node(int data)
{
this->data = data;
left = NULL;
right = NULL;
}
};
void printList(Node *root)
{
Node *curr = root;
while (curr != NULL)
{
cout << curr->data << " ";
curr = curr->right;
}
}
void flaten(Node *root)
{
if (root == NULL || (root->left == NULL and root->right == NULL))
return;
// Flatening the left subtree
if (root->left != NULL)
{
flaten(root->left);
// Storing the right subtree in a temporary variable.
Node *rightSubTree = root->right;
// Now root's right will be left subtree.
root->right = root->left;
// Finally making root's left as NULL. (It wont point anything to its left.
root->left = NULL;
// Now calculating the new right of root so that we can attach our original
// right subtree to the its right.
Node *temp = root->right;
while (temp->right != NULL)
temp = temp->right;
// Finally attaching as stated above.
temp->right = rightSubTree;
}
// Flatening the right subtree
flaten(root->right);
}
int main()
{
Node *root = new Node(5);
root->left = new Node(3);
root->right = new Node(7);
root->left->left = new Node(2);
root->left->right = new Node(4);
root->right->left = new Node(6);
root->right->right = new Node(8);
cout << "Flaten Binary Tree as singly linked list : ";
flaten(root);
printList(root);
return 0;
}