题目:
给定一颗二叉搜索树,请找出其中的第k小的结点。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。
思路:
观察可以发现,该二叉搜索树的中序遍历为{2,3,4,5,6,7,8},是一个有序的数组,这时再寻找第k个结点就很简单了。因此我们只需要给出该二叉树的中序遍历,然后在里面找即可。
程序代码:
#include<iostream>
using namespace std;
struct TreeNode
{
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x):
val(x),left(NULL),right(NULL){}
};
class Solution
{
public:
TreeNode *KthTreeNode(TreeNode *pRoot,unsigned int k)
{
if(pRoot==NULL ||k==0)
return NULL;
return KthTreeNodeCore(pRoot,k);
}
TreeNode *KthTreeNodeCore(TreeNode *pRoot,unsigned int& k)
{
TreeNode *target=NULL;
if(pRoot->left)
target=KthTreeNodeCore(pRoot->left,k);
if(!target)
{
if(k==1)
target=pRoot;
k--;
}
if(!target && pRoot->right)
target=KthTreeNodeCore(pRoot->right,k);
return target;
}
};
int main()
{
TreeNode *t1=new TreeNode(5);
TreeNode *t2=new TreeNode(3);
TreeNode *t3=new TreeNode(7);
TreeNode *t4=new TreeNode(2);
TreeNode *t5=new TreeNode(4);
TreeNode *t6=new TreeNode(6);
TreeNode *t7=new TreeNode(8);
t1->left=t2;
t1->right=t3;
t2->left=t4;
t2->right=t5;
t3->left=t6;
t3->right=t7;
cout<<(*(t1->left)).val<<endl;
Solution s;
TreeNode *t=s.KthTreeNode(t1,3);
cout<<(*t).val<<endl;
}
运行结果
3
4