Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // { Driver Code Starts
- #include<bits/stdc++.h>
- using namespace std;
- // Tree Node
- struct Node
- {
- int data;
- Node* left;
- Node* right;
- };
- // Utility function to create a new Tree Node
- Node* newNode(int val)
- {
- Node* temp = new Node;
- temp->data = val;
- temp->left = NULL;
- temp->right = NULL;
- return temp;
- }
- // Function to Build Tree
- Node* buildTree(string str)
- {
- // Corner Case
- if(str.length() == 0 || str[0] == 'N')
- return NULL;
- // Creating vector of strings from input
- // string after spliting by space
- vector<string> ip;
- istringstream iss(str);
- for(string str; iss >> str; )
- ip.push_back(str);
- // Create the root of the tree
- Node* root = newNode(stoi(ip[0]));
- // Push the root to the queue
- queue<Node*> queue;
- queue.push(root);
- // Starting from the second element
- int i = 1;
- while(!queue.empty() && i < ip.size()) {
- // Get and remove the front of the queue
- Node* currNode = queue.front();
- queue.pop();
- // Get the current node's value from the string
- string currVal = ip[i];
- // If the left child is not null
- if(currVal != "N") {
- // Create the left child for the current node
- currNode->left = newNode(stoi(currVal));
- // Push it to the queue
- queue.push(currNode->left);
- }
- // For the right child
- i++;
- if(i >= ip.size())
- break;
- currVal = ip[i];
- // If the right child is not null
- if(currVal != "N") {
- // Create the right child for the current node
- currNode->right = newNode(stoi(currVal));
- // Push it to the queue
- queue.push(currNode->right);
- }
- i++;
- }
- return root;
- }
- // } Driver Code Ends
- /* A binary Tree node
- struct Node
- {
- int data;
- struct Node *left, *right;
- };
- */
- class Solution
- {
- private:
- vector<int> ans;
- public:
- void _KDistanceNodesDown(Node *root, int k) {
- if (!root || k < 0) {
- return;
- }
- if (k == 0) {
- ans.push_back(root->data);
- }
- _KDistanceNodesDown(root->left, k-1);
- _KDistanceNodesDown(root->right, k-1);
- }
- int _KDistanceNodes(Node *root, int target, int k) {
- if (!root) {
- return 0;
- }
- if (root->data == target) {
- _KDistanceNodesDown(root, k);
- return 1;
- }
- int left = _KDistanceNodes(root->left, target, k);
- if (left != 0) {
- if (left == k) {
- ans.push_back(root->data);
- } else {
- _KDistanceNodesDown(root->right, k - left - 1);
- }
- return left + 1;
- }
- int right = _KDistanceNodes(root->right, target, k);
- if (right != 0) {
- if (right == k) {
- ans.push_back(root->data);
- } else {
- _KDistanceNodesDown(root->left, k - right - 1);
- }
- return right + 1;
- }
- return 0;
- }
- vector<int> KDistanceNodes(Node* root, int target , int k) {
- ans.clear();
- _KDistanceNodes(root, target, k);
- sort(ans.begin(), ans.end());
- return ans;
- }
- };
- // { Driver Code Starts.
- int main()
- {
- int t;
- cin>>t;
- getchar();
- Solution x = Solution();
- while(t--)
- {
- string s;
- getline(cin,s);
- Node* head = buildTree(s);
- int target, k;
- cin>> target >> k;
- getchar();
- vector <int> res = x.KDistanceNodes(head, target, k);
- for( int i=0; i<res.size(); i++ )
- cout<< res[i] << " ";
- cout<<endl;
- }
- return 0;
- }
- // } Driver Code Ends
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement