96. 不同的二叉搜索树

136 阅读1分钟

96. 不同的二叉搜索树

  • var arr = new Array(n + 1).fill(0);建立模型

  • arr[0] = 1;初始化值

  • arr[1] = 1;初始化值

  • arr[i] = arr[i] + arr[j - 1] * arr[i - j]; 当树的节点为i时,将i-1 拆分为两个部分,然后他们不同的部分分别是两种左右子树,有任何一方的不同,于是和另外一种就不同,于是用乘法运算

var numTrees = function (n) {
  var arr = new Array(n + 1).fill(0);
  arr[0] = 1;
  arr[1] = 1;
  for (var i = 2; i <= n; i++) {
    for (var j = 1; j <= i; j++) {
      arr[i] = arr[i] + arr[j - 1] * arr[i - j];
    }
  }
  return arr[n];
};

方法二

var numTrees = function(n) {
  var memo = new Array(n + 1).fill(0).map(() => new Array(n + 1).fill(0));
  var f = (i, j) => {
    if (i > j) return 1;
    if (memo[i][j] != 0) return memo[i][j];
    var res = 0;
    for (var k = i; k <= j; k++) {
      var ift = f(i, k - 1);
      var jght = f(k + 1, j);
      res += ift * jght;
    }
    memo[i][j] = res;
    return res;
  };
  return f(1, n);
};