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

本文介绍如何在给定的二叉树中找到节点最多的BST子树。提供了解法一和解法二,解法二通过自底向上遍历,将子树信息传递给父节点,以O(n)的时间复杂度找到最大的BST子树。
摘要由CSDN通过智能技术生成

给定一棵二叉树,试设计算法在这棵二叉树中寻找节点最多的 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 进行检查。实际上我们可以反过来,自底向上进行遍历,这样我们可以把子树的信息传递到其双亲节点上,双亲就可以利用这些信息在

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Storm-Shadow

你的鼓励将是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值