/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 * };
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param proot TreeNode类 
 * @param k int整型 
 * @return int整型
 */
int KthNode(struct TreeNode *proot, int k)
{
  int ret = -1;
  //带有栈辅助的中序遍历
  struct TreeNode *stack[1001];
  struct TreeNode *p;
  int count = 0;
  int top = -1;
  p = proot;
  if (!p)
    return -1;
    //会有栈空但是没有遍历完毕,此时可能会有右子树等待并入
    //也有指向NULL但是栈不空等待出栈,那就是常规的出栈操作,出的是左节点
    //所以用栈空并且指针指向NULL作为结束标志
  while (top != -1 || p != NULL)
  {
    //所有左节点入栈
    while (p)
    {
      stack[++top] = p;
      p = p->left;
    }
    //左节点和中间节点出栈,指向右子树准备并入
    if (top != -1)
    {
      count++;
      p = stack[top--];
      if (count == k)
      {
        ret = p->val;
        break;
      }
      p = p->right;
    }
  }
  return ret;
}