二叉搜索树的第k小节点
给定一颗二叉搜索树,请找出其中第k小的节点。
思路:二叉搜索树中序遍历是有序递增的。
参考代码:
#include <stdio.h> #include <stdlib.h> typedef struct treeNode
{
int value;
struct treeNode* pleft;
struct treeNode* pright;
}TreeNode;
TreeNode* kthnodeCore(TreeNode* proot,int* pk)
{
TreeNode* ptarget = NULL;
if(proot->pleft != NULL)
ptarget = kthnodeCore(proot->pleft,pk);
if(ptarget == NULL)
{
if(*pk == 1)
ptarget = proot;
--(*pk);
}
if(ptarget == NULL && proot->pright != NULL)
ptarget = kthnodeCore(proot->pright,pk);
return ptarget;
}
TreeNode* kthnode(TreeNode* proot,int k)
{
if(proot == NULL || k == 0)
return NULL;
return kthnodeCore(proot,&k);
}
TreeNode* core(int* preStart,int* preEnd,int* inStart,int* inEnd)
{
//前序遍历的地一个元素就是根节点 int rootValue = preStart[0];
TreeNode* proot = malloc(sizeof(TreeNode));
proot->value = rootValue;
proot->pleft = proot->pright = NULL;
//在中序遍历序号中找到根节点的值 int* rootIn = inStart;
while(rootIn <= inEnd && *rootIn != rootValue) ++rootIn;
int leftLen = rootIn - inStart;
int* leftPreEnd = preStart + leftLen;
if(leftLen>0)
{
proot->pleft = core(preStart+1,leftPreEnd,inStart,inStart+leftLen-1);
}
if(leftLen < preEnd - preStart)
{
proot->pright = core(leftPreEnd+1,preEnd,rootIn+1,inEnd);
}
return proot;
}
TreeNode* construct(int* pre,int* in,int len)
{
if(pre==NULL || in==NULL || len<=0) return 0;
return core(pre,pre+len-1,in,in+len-1);
}
void preOrder(TreeNode* root)
{
if(root == NULL)
return;
printf("%d ",root->value);
preOrder(root->pleft);
preOrder(root->pright);
}
int main()
{
int pre[] = {5,3,2,4,7,6,8};
int in[] = {2,3,4,5,6,7,8};
TreeNode* ptree = construct(pre,in,sizeof(pre)/sizeof(int));
preOrder(ptree);
TreeNode* k = kthnode(ptree,3);
printf("\n第3小:%d\n",k->value);
return 0;
}