题干:
给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。
方法:二叉树的中序遍历,递归和非递归方式。
源代码1(递归方法):
class Solution {
public:
TreeNode* KthNode(TreeNode* pRoot, int k)
{
mid(pRoot,k);
return res;
}
void mid(TreeNode* pRoot,int k)
{
if(!pRoot)
return;
mid(pRoot->left,k);
num++;
if(num==k)
res=pRoot;
mid(pRoot->right,k);
}
private:
int num=0;
TreeNode* res=NULL;
};
源代码2(非递归方法):
TreeNode KthNode(TreeNode root, int k){
if(root==null||k==0)
return null;//排错
Stack<TreeNode> stack = new Stack<TreeNode>();//申请一个树结点栈
int count = 0;//计数器
TreeNode node = root;
do{
if(node!=null){
stack.push(node);
node = node->left;
}else{
node = stack.pop();
count++;
if(count==k)
return node;
node = node->right;
}
}while(node!=null||!stack.isEmpty());
return null;
}