From f39e1b99a5dc050e1f60f14257af0a320466a84b Mon Sep 17 00:00:00 2001 From: Shashank Kumar Srivastava <95871637+shashank0412@users.noreply.github.com> Date: Fri, 6 Oct 2023 01:27:10 +0530 Subject: [PATCH] Create tree.cpp --- tree.cpp | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 tree.cpp diff --git a/tree.cpp b/tree.cpp new file mode 100644 index 0000000..c416166 --- /dev/null +++ b/tree.cpp @@ -0,0 +1,74 @@ + +#include + +void markParents(BinaryTreeNode *root, unordered_map *, BinaryTreeNode *> &parent_track, BinaryTreeNode *target) +{ + queue *> queue; + queue.push(root); + while (!queue.empty()) + { + BinaryTreeNode *current = queue.front(); + queue.pop(); + if (current->left) + { + parent_track[current->left] = current; + queue.push(current->left); + } + if (current->right) + { + parent_track[current->right] = current; + queue.push(current->right); + } + } +} + +vector *> printNodesAtDistanceK(BinaryTreeNode *root, BinaryTreeNode *target, int k) +{ + unordered_map *, BinaryTreeNode *> parent_track; + + markParents(root, parent_track, target); + + unordered_map *, bool> visited; + + queue *> queue; + queue.push(target); + visited[target] = true; + int curr_level = 0; + + while (!queue.empty()) + { + int size = queue.size(); + + if (curr_level++ == k) + break; + + for (int i = 0; i < size; i++) + { + BinaryTreeNode *current = queue.front(); + queue.pop(); + if (current->left && !visited[current->left]) + { + queue.push(current->left); + visited[current->left] = true; + } + if (current->right && !visited[current->right]) + { + queue.push(current->right); + visited[current->right] = true; + } + if (parent_track[current] && !visited[parent_track[current]]) + { + queue.push(parent_track[current]); + visited[parent_track[current]] = true; + } + } + } + vector *> result; + while (!queue.empty()) + { + BinaryTreeNode *current = queue.front(); + queue.pop(); + result.push_back(current); + } + return result; +}