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