美文网首页
lintcode unique Binary Search Tr

lintcode unique Binary Search Tr

作者: 111浪子111 | 来源:发表于2018-03-20 15:44 被阅读3次

    Givenn, how many structurally unique BST's (binary search trees) that store values 1...n?

    For example,

    Givenn= 3, there are a total of 5 unique BST's.

      1        3    3      2      1

        \      /    /      / \      \

        3    2    1      1  3      2

        /    /      \                \

      2    1        2                3

    给出n,问由 1...n为节点组成的不同的二叉查找树有多少种?

    思路:

    可以用分治的方法解决,二叉查找树大家都知道,左子树都小于root,右子树都大于root。求n个二叉查找树的不同排列总类,以i为分割,我可以求前i个节点的总类和后n-i-1个节点的总类,这样以第i个节点为root的二叉树一共有kind[0~i]*kind[i~n]种,然后把从0到n的总数相加,最后就是我要的结果。不难想到这个是一个递归的过程,求前i个节点总类的时候,又把i分为两部分,同样后n-i-1个节点也是一样的。如果只有一个节点,当然只有一种结果,所以递归出口是返回1。

    根据以上分析,不难写出代码:

    long getBinaryTreeKinds(long nodeCount)

    {

        if (nodeCount <= 1)

        {

            return 1;

        }

        long result = 0;

        for (int i = 0; i < nodeCount; i++) {

            result += getBinaryTreeKinds(i)*getBinaryTreeKinds(nodeCount-i-1);

        }

        return result;

    }

    但是这个递归我们可以优化一下,因为它存在太多的重复计算,我们可以用一个数组保存每次计数的结果,这样会大大提高效率。

    优化后的代码:

    long binaryTreeKindCount(long n)

    {

        long *count = malloc((n + 1)*sizeof(long)); // 保存每次计算的结果,防止重复计算

        memset(count, 0, (n + 1)*sizeof(long)); // 清零防止脏数据

        long r = getBinaryTreeKindsFaster(n, count);

        free(count);

        return r;

    }

    long getBinaryTreeKindsFaster(long nodeCount,long count[])

    {

        if (nodeCount <= 1)

        {

            return 1;

        }

        long result = 0;

        for (int i = 0; i < nodeCount; i++) {

            if (count[i] == 0) {

                count[i] = getBinaryTreeKindsFaster(i,count);

            }

            if (count[nodeCount-i-1] == 0) {

                count[nodeCount-i-1] = getBinaryTreeKindsFaster(nodeCount-i-1,count);

            }

            result += count[i]*count[nodeCount-i-1];

        }

        return result;

    }

    相关文章

      网友评论

          本文标题:lintcode unique Binary Search Tr

          本文链接:https://www.haomeiwen.com/subject/trrbqftx.html