LeetCode0096.不同的二叉搜索树

题目要求

 

 

算法分析

当左右子树的节点数确定时,树的种类数 = 左子树的种类数*右子树的种类数

左右子树的节点数有多种情况,所以将各种情况下的结果求和即可得答案

F(节点数) = ΣF(左子树节点数) * F(右子树节点数)

 

动态规划

F(0) = 0;  (后面参与乘法计算时F(0) = 1)

F(1) = 1;

F(2) = F(0)*F(1) + F(1)*F(0);

F(3) = F(0)*F(2) + F(1)*F(1) +F(2)*F(0);

......

F(n) = F(0) * F(n-1) + F(1) * F(n-2) + ......+ F(n-1) * F(0);

 

代码展示(C#)

public class Solution {
    public int NumTrees(int n) {
        if(n == 0){return 0;}
        int[] array = new int[n+1];
        array[0] = 1;
        array[1] = 1;
        for(int i = 2; i <= n; i++){
            int temp = 0;
            for(int j = 0; j < i; j++ ){
                temp += array[j]*array[i-1-j];
            }
            array[i]=temp;
        }
        return array[n];
    }
}

 

提交结果

 

posted on 2020-07-15 15:01  King__R  阅读(91)  评论(0编辑  收藏  举报