在BST中查找节点最多的子BST

给定一棵二叉树,试设计算法在这棵二叉树中寻找节点最多的 BST(Binary Search Tree),如果整棵二叉树本身就是一棵 BST,那么返回整棵树的节点数量。如下是几个例子

在BST中查找节点最多的子BST_第1张图片

解法一:可以从根节点开始遍历整棵二叉树,对每个节点,检查以它为根的子树是否是 BST,如果是,那么返回其节点数量,否则递归遍历其左、右子树并返回其左、右子树中节点最多的 BST。这种算法复杂度为 O(n^2),关键算法如下

/* 
  max() returns maximum of two integers 
*/  
int largestBST(struct node *root)
{
   if (isBST(root))
     return size(root); 
   else
    return max(largestBST(root->left), largestBST(root->right));
}

解法二:在解法一中,我们从根节点自顶向下对以每个节点为根的子树是否是 BST 进行检查。实际上我们可以反过来,自底向上进行遍历,这样我们可以把子树的信息传递到其双亲节点上,双亲就可以利用这些信息在 O(1) 的时间内判断以它为根的节点的子树是不是 BST 了。左子树需要告诉其双亲,它是不是 BST 以及它的最大节点值是多少,右子树需要告诉其双亲,它是不是 BST 以及它的最小节点值是多少,这样双亲就可以根据 BST 的特性来判断以它为根的子树是不是 BST 了。所以子树需向双亲传递的信息有:

(1)子树是否是 BST(算法实现中的 is_bst_ref 就是用于标志一棵子树是不是 B

你可能感兴趣的:(剑指offer-算法与数据结构,算法,数据结构,BST)