I am trying to flatten a binary search tree to a singly linked list.
Binary search tree:
6
/ \
4 8
/ \ \
1 5 11
/
10
Flattened Singly Linked List:
1 -> 4 -> 5 -> 6 -> 8 -> 10 -> 11
I can't seem to figure this out for some reason.
I have a struct for the tree nodes:
typedef stuct node {
int key;
struct node *left;
struct node *right;
} Node;
I have a function to create and allocate memory to the tree node:
Node* newNode (int key) {
Node *new = malloc (sizeof(Node));
new->left = NULL;
new->right = NULL;
new->key = key;
return new;
}
I have a struct for the list nodes:
typedef struct list {
int key;
struct list* next;
} List;
I have a function to create the list node:
List* newListNode (int key) {
List *new = malloc(sizeof(List));
new->key = key;
new->next = NULL;
return new;
}
And I have working functions to create the binary search tree, to insert the values, etc., but now I need to create a function to flatten the tree to a list.
List* flattenToLL(Node* root) {
...
}
I just can't seem to figure out how to flatten it to a singly linked list. I have seen a lot of other threads and sites discussing a conversion of a binary search tree to a doubly or circular linked list, but none about copying the values into a singly linked list. If anyone can offer up suggestions on how I can accomplish this I would really appreciate it. This is for a homework assignment, so if you can also provide a small explanation to help me learn that would be great.
Below is the Java code if someone is interested:
This is relatively simple to do recursively:
Here is how you can code it up:
There is also non-recursive solution for the problem here.
It gives you O(n) time complexity and O(1) space complexity. With recursive solution you can get stack overflow if e.g. you apply it to its own output for a big node set.
We can use recurssion where we build a linked list for each level in the tree and add the list to a vector of lists. With this solution we need to keep a track of which level we are on, so if we have a linked list already for a level and we visit a node on a level visited before we can just add to that list.
I have not added any code for my own node class as its not relevant to the question, also no memory clean up is being demonstrated, however a better solution would be to use boost::shared_ptr to handle clean up.