给定一棵二叉搜索树,请找出其中第k大的节点。

//方法1:递归中序遍历

int count=0;//记录遍历了多少个
TreeNode* kNode=NULL; //记录下节点 
 
void midOrder(TreeNode* root,int k)
{
	if(root)
	{
		midOrder(root->left,k);
		count++;
		if(count==k)
		{
			kNode=root;
		}
		midOrder(root->right,k);
	}
}
TreeNode* KthNode(TreeNode* pRoot, int k) 
{
	midOrder(pRoot,k);
    return kNode;    
}

//方法2:用栈记录当前结点,不断往左深入,直到左边子树为空,再弹出栈顶(即为当前子树的父结点),

//然后再访问其右子树,其中每棵子树都遵循左中右的次序。

TreeNode* KthNode(TreeNode* pRoot, int k) 
{
	stack<TreeNode*> NodeStack;//声明一个栈 存根节点 
	TreeNode* p=pRoot;//用来指向当前根节点 
	int count=0;//用来和k进行比较 
	while(p!=NULL)
	{
		NodeStack.push(p);
		p=p->left;
		//左子树不是空时,继续循环入栈 
		while(p==NULL&&(!NodeStack.empty()))
		{
			p=NodeStack.top();// 根节点出栈,count++ 
			count++;
			if(count==k)
			{
				return p;//当前结点就是第k个结点 
			}
			NodeStack.pop(); 
			p=p->right;//遍历右结点 		
		}
	}
	
    return NULL;    
}