Amazon Interview Questions: 
The following are the questions asked today (16/9/2017) in Amazon. 
1- Find the number of repetitions of a given element in the sorted array in O(logn) ?
2- Print Diagonal Traversal of the binary tree ?
Can anyone optimize it further and provide comments?
Answer 1:  number of repetitions in sorted array
int findkRepeatCount(vector arr, int k) 
{
 int first = 0;
 int last = arr.size() - 1;
 int count = 0;
 bool lastKElement = false;
 bool startKElement = false;
 bool midKElement = false;
 int mid;
 while (first <= last)
 {
  mid = (first + last) / 2;
  if (arr[mid] == k && arr[mid - 1] < k && arr[mid + 1] >k)
  {
   return 1;
  }
  if (arr[mid] == k && arr[mid - 1] < k)
  {
   startKElement = true;
   break;
  }
  if (arr[mid] == k && arr[mid - 1] > k)
  {
   lastKElement = true;
   break;
  }
  if (arr[mid] == k)
  {
   midKElement = true;
   break;
  }
  if (arr[mid] > k )
  {
   last = mid - 1;
  }
  if (arr[mid] < k)
  {
   first = mid + 1;
  }  
 }
 if (startKElement)
 {
  while (mid < arr.size() && arr[mid] == k)
  {
   ++mid;
   ++count;
  }
  return count;
 }
 if (lastKElement)
 {
  while (mid >= 0 && arr[mid] == k)
  {
   --mid;
   ++count;     
  }
  return count;
 }
 if (midKElement)
 {
  int temp = mid + 1;
  while (mid >= 0 && arr[mid] == k )
  {
   --mid;
   ++count;
  }
  while (temp 
  {
   ++temp;
   ++count;
  }
  return count;
 } 
 return 0;
}
Answer 2: Diagonal Traversal of the binary tree
struct treeNode
{
 int value;
 treeNode* left;
 treeNode* right;
};
class tree
{
void printNodeDiag(treeNode* root, int diag, std::unordered_map>& mp); 
public:
 tree();
 ~tree();
 treeNode* createNode(int);
 void PrintNodes(treeNode*);
 void printNodeDiag(treeNode*);
 treeNode* root;
};
tree::tree()
{
 root = nullptr;
}
treeNode* tree::createNode(int val)
{
 treeNode * newNode = new treeNode;
 newNode->value = val;
 newNode->left = nullptr;
 newNode->right = nullptr;
 return newNode;
}
void tree::PrintNodes(treeNode* root)
{
 if (root == nullptr) return;
 PrintNodes(root->left);
 cout << root->value << " ";
 PrintNodes(root->right);
}
void tree::printNodeDiag(treeNode* root, int diag, std::unordered_map>& mp) 
{
 if (root == nullptr) return;
 mp[diag].push_back(root->value);
 printNodeDiag(root->left, diag + 1, mp);
 printNodeDiag(root->right, diag, mp);
}
void tree::printNodeDiag(treeNode* root)
{
 std::unordered_map> map; 
 printNodeDiag(root, 0, map);
 for (auto it : map)
 {
  for (auto itt : it.second)
  {
   cout << itt << " ";
  }
  cout << endl;
 }
}
tree::~tree()
{
}
Test Drive
int main()
{
         vector myarr = { 1,1,2,3,4,8,8,8,8};
 int repeatElemtentCount = findkRepeatCount(myarr, 8);
 tree mytree;
 mytree.root = mytree.createNode(1);
 mytree.root->right = mytree.createNode(3);
 mytree.root->right->right = mytree.createNode(6);
 mytree.root->right->left = mytree.createNode(5);
 mytree.root->right->left->right = mytree.createNode(8);
 mytree.root->right->left->left = mytree.createNode(7);
 mytree.root->left = mytree.createNode(2);
 mytree.root->left->left = mytree.createNode(4);
 cout << endl;
 cout << "print tree in-order\n";
 mytree.PrintNodes(mytree.root);
 cout << "print tree in diegonal order\n";
 mytree.printNodeDiag(mytree.root);
 cout << endl;
 return 0;
} 
