二叉搜索树的第k小节点

二叉搜索树的第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;
}

    原文作者:ailx10
    原文地址: https://zhuanlan.zhihu.com/p/34518035
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞