二叉树 判断子树中最大搜索二叉树节点个数、最大搜索二叉树顶点

85 阅读1分钟

题目

给定一个二叉树,返回子树中最大搜索二叉树的节点个数和最大搜索二叉树的顶点

  • 构造二叉树递归结构,从左右子树拿相关信息,处理好base case,然后根据信息更新当前节点信息(当前节点要考虑叶子节点和其他节点)
  • 如果当前节点不是搜索二叉树的顶点,从左右子树拿信息
  • 如果当前节点是搜索二叉树,从左右子树拿信息后,那么当前节点构成的就是目前的最大搜索二叉树,然后更新相关信息
class Info {
  constructor(maxBSTHead, isBST, min, max, maxBSTSize) {
    this.maxBSTHead = maxBSTHead;
    this.isBST = isBST;
    this.min = min;
    this.max = max;
    this.maxBSTSize = maxBSTSize;
  }
}

function process(x) {
  if (x === null) {
    return null;
  }

  const leftInfo = process(x.left);
  const rightInfo = process(x.right);

  let maxBSTHead = null,
    isBST = false,
    min = x.value,
    max = x.value,
    maxBSTSize = 0;

  // 比较最值
  if (leftInfo !== null) {
    min = Math.min(x.value, leftInfo.min);
    max = Math.max(x.value, leftInfo.max);
  }

  if (rightInfo !== null) {
    min = Math.min(min, rightInfo.min);
    max = Math.max(max, rightInfo.max);
  }

  // 比较节点数和节点
  if (leftInfo !== null) {
    maxBSTSize = leftInfo.maxBSTSize;
    maxBSTHead = leftInfo.maxBSTHead;
  }

  if (rightInfo !== null && rightInfo.maxBSTSize > maxBSTSize) {
    maxBSTSize = rightInfo.maxBSTSize;
    maxBSTHead = rightInfo.maxBSTHead;
  }

  // 判断当前顶点构成的树是否是搜索二叉树
  // 第一个if判断左右树是否都是搜索二叉树
  if (
    (leftInfo == null || leftInfo.isBST) &&
    (rightInfo === null || rightInfo.isBST)
  ) {
    // 以当前节点构成的树也是搜索二叉树
    if (
      (leftInfo === null || leftInfo.max < x.value) &&
      (rightInfo === null || rightInfo.min > x.value)
    ) {
      isBST = true;
      maxBSTHead = x;  // maxBSTHead 在这设置是因为首先你得存在搜索二叉树
      maxBSTSize = (leftInfo.maxBSTSize ?? 0) + 1 + (rightInfo.maxBSTSize ?? 0);
    }
  }

  return new Info(maxBSTHead, isBST, min, max, maxBSTSize);
}