给定一棵二叉树,试设计算法在这棵二叉树中寻找节点最多的 BST(Binary Search Tree),如果整棵二叉树本身就是一棵 BST,那么返回整棵树的节点数量。如下是几个例子
解法一:可以从根节点开始遍历整棵二叉树,对每个节点,检查以它为根的子树是否是 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 进行检查。实际上我们可以反过来,自底向上进行遍历,这样我们可以把子树的信息传递到其双亲节点上,双亲就可以利用这些信息在