Code for the following Questions can be found in below code.
Q: Given a node of Binary Tree . find all node's at distance k from it .
Q: Simple InOrder, PreOrder, PostOrder Traversals of the Tree.
Q: Given a node in the Tree. Find path from the root of tree to the node.
Q: Given a node in the Tree. Find the height of the node from the root.
Q: Given a node of Binary Tree . find all node's at distance k from it .
Q: Simple InOrder, PreOrder, PostOrder Traversals of the Tree.
Q: Given a node in the Tree. Find path from the root of tree to the node.
Q: Given a node in the Tree. Find the height of the node from the root.
/* Written By BrOkEN@! Q: Given a node of Binary Tree . find all node's at distance k from it . Q: Simple InOrder,PreOrder,PostOrder Traversals of the Tree. Q: Given a node in the Tree. Find path from the root of tree to the node. Q: Given a node in the Tree. Find the height of the node from the root. */ #include<iostream> #include<sstream> #include<fstream> #include<string> #include<algorithm> #include<vector> #include<map> #include<queue> #include<stack> #include<set> #include<cstdio> #include<cstdlib> #include<cstddef> #include<cstring> #include<cctype> #include<cmath> #include<cassert> #include<climits> #define INFINITE 1000000 using namespace std; struct node{ int data; struct node* left; struct node* right; }; struct trackNode{ struct node* pNode; struct trackNode* parent; }; struct trackNode *list=NULL,*head=NULL; void insertTrackNode(struct node* p){ struct trackNode *temp = (struct trackNode*)malloc(sizeof(struct trackNode)); temp->pNode=p; if(list==NULL){ head=temp; }else{ list->parent=temp; } list=temp; }; /*Find path from root to Specific Node*/ bool trackPath(struct node *root, struct node *p){ if(root==NULL){ return false; } if(root==p){ insertTrackNode(root); return true; }else{ if(trackPath(root->left,p)||trackPath(root->right,p)){ insertTrackNode(root); return true; }else{ return false; } } }; /*Constructing a tree and returning the root*/ struct node* buildTree(){ struct node* n01=(struct node*) malloc(sizeof(struct node));n01->data=1; struct node* n02=(struct node*) malloc(sizeof(struct node));n02->data=2; struct node* n03=(struct node*) malloc(sizeof(struct node));n03->data=3; struct node* n04=(struct node*) malloc(sizeof(struct node));n04->data=4; struct node* n05=(struct node*) malloc(sizeof(struct node));n05->data=5; struct node* n06=(struct node*) malloc(sizeof(struct node));n06->data=6; struct node* n07=(struct node*) malloc(sizeof(struct node));n07->data=7; struct node* n08=(struct node*) malloc(sizeof(struct node));n08->data=8; struct node* n09=(struct node*) malloc(sizeof(struct node));n09->data=9; struct node* n10=(struct node*) malloc(sizeof(struct node));n10->data=10; struct node* n11=(struct node*) malloc(sizeof(struct node));n11->data=11; struct node* n12=(struct node*) malloc(sizeof(struct node));n12->data=12; struct node* n13=(struct node*) malloc(sizeof(struct node));n13->data=13; struct node* n14=(struct node*) malloc(sizeof(struct node));n14->data=14; struct node* n15=(struct node*) malloc(sizeof(struct node));n15->data=15; n08->left=n04;n08->right=n12; n04->left=n02;n04->right=n06; n02->left=n01;n02->right=n03; n06->left=n05;n06->right=n07; n12->left=n10;n12->right=n14; n10->left=n09;n10->right=n11; n14->left=n13;n14->right=n15; n01->left=n01->right=NULL; n03->left=n03->right=NULL; n05->left=n05->right=NULL; n07->left=n07->right=NULL; n09->left=n09->right=NULL; n11->left=n11->right=NULL; n13->left=n13->right=NULL; n15->left=n15->right=NULL; return n08; }; /*InOrder Traversal of Tree with root Node*/ void inOrder(struct node* root){ if(root!=NULL){ inOrder(root->left); printf("%d ",root->data); inOrder(root->right); } }; /*PreOrder Traversal of Tree with root Node*/ void preOrder(struct node* root){ if(root!=NULL){ printf("%d ",root->data); preOrder(root->left); preOrder(root->right); } }; /*PostOrder Traversal of Tree with root Node*/ void postOrder(struct node* root){ if(root!=NULL){ postOrder(root->left); postOrder(root->right); printf("%d ",root->data); } }; /*Find Nodes at distance K from the root(possibility to skip subtree is also provided.)*/ void findNodesAtDistanceK(struct node *root,int k,bool left,bool right){ if(root!=NULL){ if(k==0){ printf("%d ",root->data); return; } if(left==true && right==false){ findNodesAtDistanceK(root->left,k-1,true,true); }else if(left==false && right==true){ findNodesAtDistanceK(root->right,k-1,true,true); }else{ findNodesAtDistanceK(root->left,k-1,true,true); findNodesAtDistanceK(root->right,k-1,true,true); } } } /*Get Height of the node*/ int getHeight(struct node* root,struct node* p){ if(root==NULL){ return INFINITE; } if(root==p){ return 0; }else{ int l=1+getHeight(root->left,p); int r=1+getHeight(root->right,p); if(l>r){ return r; }else{ return l; } } } int main(){ int k=3;//Distance struct node *root=NULL; root=buildTree(); struct node* p=root->right->left->right; //get a random node from Tree if(trackPath(root,p)){ int i=0; struct trackNode* prev=NULL; while(head!=NULL && i<=k){ if(prev==NULL){ findNodesAtDistanceK(head->pNode,k-i,true,true); }else{ findNodesAtDistanceK(head->pNode,k-i,head->pNode->left!=prev->pNode,head->pNode->right!=prev->pNode); } prev=head; head=head->parent; i++; } } system("PAUSE"); }
No comments:
Post a Comment