给定一棵二叉搜索树,请找出其中第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;
}