4.4 Given a binary search tree, design an algorithm which creates a linked list of all the nodes at each depth (e.g., if you have a tree with depth D, you'll have D linked lists).
template <typename T>
struct ListNode {
T data;
ListNode *next;
ListNode(T d) : data(d), next(NULL) {}
};
struct TreeNode {
int val;
TreeNode *left, *right;
TreeNode(int v) : val(v), left(NULL), right(NULL) {}
};
template <typename T>
void appendNode(ListNode<T> *head, T data) {
while (head->next) {
head = head->next;
}
head->next = new ListNode<T>(data);
}
void createLevelLists(TreeNode *node, vector<ListNode<TreeNode*>*> &lists, int level) {
if (node == NULL) {
return;
}
if (lists.size() == level) {
ListNode<TreeNode*>* l = new ListNode<TreeNode*>(node);
lists.push_back(l);
} else {
appendNode(lists[level], node);
}
createLevelLists(node->left, lists, level + 1);
createLevelLists(node->right, lists, level + 1);
}
vector<ListNode<TreeNode*>*> createLevelLists(TreeNode *root) {
vector<ListNode<TreeNode*>*> lists;
createLevelLists(root, lists, 0);
return lists;
}