void left(TreeNode<int> *root, vector<int> &ans){
if(root==NULL || (root->left==NULL &&root->right==NULL)) return; //check null,leaf
ans.push_back(root->data); //add left value to ans
if(root->left) { //traverse to left or to right child if left absent
left(root->left,ans);
}else{
left(root->right,ans);
}
}
void leafT(TreeNode<int> *root, vector<int> &ans){ //LNR
if(root==NULL) return ; //we have to traverse
if(root->left==NULL && root->right ==NULL){
ans.push_back(root->data);
return; //now we can return as it leaf no furthe rcheck
}
if(root->left) leafT(root->left,ans);
if(root->right) leafT(root->right,ans);
}
void right(TreeNode<int> *root, vector<int> &ans){
if(root==NULL || (root->left==NULL &&root->right==NULL)) return;
if(root->right) {
right(root->right,ans);
}else{
right(root->left,ans);
}
ans.push_back(root->data);
}
vector<int> traverseBoundary(TreeNode<int> *root)
{
vector<int> ans;
if(root==NULL) return ans;
ans.push_back(root->data);
left(root->left, ans);
leafT(root,ans);
right(root->right,ans);
return ans;
}