二叉树中的最大BST |集2

给定一棵二叉树,编写一个函数,返回最大子树的大小,也就是二叉搜索树(BST)。如果完整的二叉树是BST,则返回整个树的大小。 例如:

null
Input:       5    /     2    4 /  1    3Output: 3 The following subtree is the maximum size BST subtree    2   /  1    3Input:        50     /      30       60 /       /   5   20   45    70              /              65    80Output: 5The following subtree is themaximum size BST subtree       60     /      45    70        /        65    80

建议:请在“上解决” 实践 “首先,在讨论解决方案之前。

我们在下面的帖子中讨论了两种方法。 在给定的二叉树|集合1中查找最大的BST子树 在这篇文章中,我们讨论了一种不同的O(n)解决方案。这个解决方案比上面讨论的解决方案更简单,并且可以在O(n)时间内工作。 这个想法是基于 检查二叉树是否为BST文章 . 如果对每个节点x执行以下操作,则树为BST。

  1. 左子树(x的)中的最大值小于x的值。
  2. 右子树(x的)中的最小值大于x的值。

我们以自下而上的方式穿过这棵树。对于每个被遍历的节点,我们都会在以其为根的子树中返回最大值和最小值。如果任何节点遵循上述属性和大小

C++

// C++ program to find largest BST in a
// Binary Tree.
#include <bits/stdc++.h>
using namespace std;
/* A binary tree node has data,
pointer to left child and a
pointer to right child */
struct Node
{
int data;
struct Node* left;
struct Node* right;
};
/* Helper function that allocates a new
node with the given data and NULL left
and right pointers. */
struct Node* newNode( int data)
{
struct Node* node = new Node;
node->data = data;
node->left = node->right = NULL;
return (node);
}
// Information to be returned by every
// node in bottom up traversal.
struct Info
{
int sz; // Size of subtree
int max; // Min value in subtree
int min; // Max value in subtree
int ans; // Size of largest BST which
// is subtree of current node
bool isBST; // If subtree is BST
};
// Returns Information about subtree. The
// Information also includes size of largest
// subtree which is a BST.
Info largestBSTBT(Node* root)
{
// Base cases : When tree is empty or it has
// one child.
if (root == NULL)
return {0, INT_MIN, INT_MAX, 0, true };
if (root->left == NULL && root->right == NULL)
return {1, root->data, root->data, 1, true };
// Recur for left subtree and right subtrees
Info l = largestBSTBT(root->left);
Info r = largestBSTBT(root->right);
// Create a return variable and initialize its
// size.
Info ret;
ret.sz = (1 + l.sz + r.sz);
// If whole tree rooted under current root is
// BST.
if (l.isBST && r.isBST && l.max < root->data &&
r.min > root->data)
{
ret.min = min(l.min, min(r.min, root->data));
ret.max = max(r.max, max(l.max, root->data));
// Update answer for tree rooted under
// current 'root'
ret.ans = ret.sz;
ret.isBST = true ;
return ret;
}
// If whole tree is not BST, return maximum
// of left and right subtrees
ret.ans = max(l.ans, r.ans);
ret.isBST = false ;
return ret;
}
/* Driver program to test above functions*/
int main()
{
/* Let us construct the following Tree
60
/
65  70
/
50 */
struct Node *root = newNode(60);
root->left = newNode(65);
root->right = newNode(70);
root->left->left = newNode(50);
printf ( " Size of the largest BST is %d" ,
largestBSTBT(root).ans);
return 0;
}
// This code is contributed by Vivek Garg in a
// comment on below set 1.
// www.geeksforgeeks.org/find-the-largest-subtree-in-a-tree-that-is-also-a-bst/


JAVA

// Java program to find largest BST in a Binary Tree.
/* A binary tree node has data, pointer to left child and a pointer to right child */
class Node {
int data;
Node left, right;
public Node( final int d) {
data = d;
}
}
class GFG {
public static void main(String[] args) {
/* Let us construct the following Tree
60
/
65  70
/
50 */
final Node node1 = new Node( 60 );
node1.left = new Node( 65 );
node1.right = new Node( 70 );
node1.left.left = new Node( 50 );
System.out.print( "Size of the largest BST is " + Solution.largestBst(node1) + "" );
}
}
class Solution {
static int MAX = Integer.MAX_VALUE;
static int MIN = Integer.MIN_VALUE;
static class nodeInfo {
int size; // Size of subtree
int max; // Min value in subtree
int min; // Max value in subtree
boolean isBST; // If subtree is BST
nodeInfo() {
}
nodeInfo( int size, int max, int min, boolean isBST) {
this .size = size;
this .max = max;
this .min = min;
this .isBST = isBST;
}
}
static nodeInfo largestBST(Node root) {
// Base cases : When tree is empty or it has one child.
if (root == null ) {
return new nodeInfo( 0 , MIN, MAX, true );
}
if (root.left == null && root.right == null ) {
return new nodeInfo( 1 , root.data, root.data, true );
}
// Recur for left subtree and right subtrees
nodeInfo left = largestBST(root.left);
nodeInfo right = largestBST(root.right);
// Create a return variable and initialize its size.
nodeInfo returnInfo = new nodeInfo();
// If whole tree rooted under current root is BST.
if (left.isBST && right.isBST && left.max < root.data && right.min > root.data) {
returnInfo.min = Math.min(Math.min(left.min, right.min), root.data);
returnInfo.max = Math.max(Math.max(left.max, right.max), root.data);
// Update answer for tree rooted under current 'root'
returnInfo.size = left.size + 1 + right.size;
returnInfo.isBST = true ;
return returnInfo;
}
// If whole tree is not BST, return maximum of left and right subtrees
returnInfo.size = Math.max(left.size, right.size);
returnInfo.isBST = false ;
return returnInfo;
}
// Return the size of the largest sub-tree which is also a BST
static int largestBst(Node root) {
return largestBST(root).size;
}
}
// This code is contributed by Andrei Sljusar


Python3

# Python program to find largest
# BST in a Binary Tree.
INT_MIN = - 2147483648
INT_MAX = 2147483647
# Helper function that allocates a new
# node with the given data and None left
# and right pointers.
class newNode:
# Constructor to create a new node
def __init__( self , data):
self .data = data
self .left = None
self .right = None
# Returns Information about subtree. The
# Information also includes size of largest
# subtree which is a BST
def largestBSTBT(root):
# Base cases : When tree is empty or it has
# one child.
if (root = = None ):
return 0 , INT_MIN, INT_MAX, 0 , True
if (root.left = = None and root.right = = None ) :
return 1 , root.data, root.data, 1 , True
# Recur for left subtree and right subtrees
l = largestBSTBT(root.left)
r = largestBSTBT(root.right)
# Create a return variable and initialize its
# size.
ret = [ 0 , 0 , 0 , 0 , 0 ]
ret[ 0 ] = ( 1 + l[ 0 ] + r[ 0 ])
# If whole tree rooted under current root is
# BST.
if (l[ 4 ] and r[ 4 ] and l[ 1 ] <
root.data and r[ 2 ] > root.data) :
ret[ 2 ] = min (l[ 2 ], min (r[ 2 ], root.data))
ret[ 1 ] = max (r[ 1 ], max (l[ 1 ], root.data))
# Update answer for tree rooted under
# current 'root'
ret[ 3 ] = ret[ 0 ]
ret[ 4 ] = True
return ret
# If whole tree is not BST, return maximum
# of left and right subtrees
ret[ 3 ] = max (l[ 3 ], r[ 3 ])
ret[ 4 ] = False
return ret
# Driver Code
if __name__ = = '__main__' :
"""Let us construct the following Tree
60
/
65 70
/
50 """
root = newNode( 60 )
root.left = newNode( 65 )
root.right = newNode( 70 )
root.left.left = newNode( 50 )
print ( "Size of the largest BST is" ,
largestBSTBT(root)[ 3 ])
# This code is contributed
# Shubham Singh(SHUBHAMSINGH10)


C#

// C# program to find largest BST in a Binary Tree.
/* A binary tree node has data, pointer to left child and a
* pointer to right child */
using System;
public
class Node {
public
int data;
public
Node left,
right;
public Node( int d) { data = d; }
}
public class GFG {
public static void Main(String[] args)
{
/*
* Let us construct the following Tree 60 / 65 70
* / 50
*/
Node node1 = new Node(60);
node1.left = new Node(65);
node1.right = new Node(70);
node1.left.left = new Node(50);
Console.Write( "Size of the largest BST is "
+ Solution.largestBst(node1) + "" );
}
}
public
class Solution {
static int MAX = int .MaxValue;
static int MIN = int .MinValue;
public
class nodeInfo {
public int size; // Size of subtree
public int max; // Min value in subtree
public int min; // Max value in subtree
public bool isBST; // If subtree is BST
public
nodeInfo()
{
}
public
nodeInfo( int size, int max, int min, bool isBST)
{
this .size = size;
this .max = max;
this .min = min;
this .isBST = isBST;
}
}
public
static nodeInfo
largestBST(Node root)
{
// Base cases : When tree is empty or it has one
// child.
if (root == null ) {
return new nodeInfo(0, MIN, MAX, true );
}
if (root.left == null && root.right == null ) {
return new nodeInfo(1, root.data, root.data,
true );
}
// Recur for left subtree and right subtrees
nodeInfo left = largestBST(root.left);
nodeInfo right = largestBST(root.right);
// Create a return variable and initialize its size.
nodeInfo returnInfo = new nodeInfo();
// If whole tree rooted under current root is BST.
if (left.isBST && right.isBST
&& left.max < root.data
&& right.min > root.data) {
returnInfo.min = Math.Min(
Math.Min(left.min, right.min), root.data);
returnInfo.max = Math.Max(
Math.Max(left.max, right.max), root.data);
// Update answer for tree rooted under current
// 'root'
returnInfo.size = left.size + 1 + right.size;
returnInfo.isBST = true ;
return returnInfo;
}
// If whole tree is not BST, return maximum of left
// and right subtrees
returnInfo.size = Math.Max(left.size, right.size);
returnInfo.isBST = false ;
return returnInfo;
}
// Return the size of the largest sub-tree which is also
// a BST
public
static int
largestBst(Node root)
{
return largestBST(root).size;
}
}
// This code is contributed by Rajput-Ji


Javascript

<script>
// javascript program to find largest BST in a Binary Tree.
/* A binary tree node has data, pointer to left child and a pointer to right child */
class Node {
constructor(val) {
this .data = val;
this .left = null ;
this .right = null ;
}
}
var MAX = Number.MAX_VALUE;
var MIN = Number.MIN_VALUE;
class nodeInfo {
constructor(size , max , min,  isBST) {
this .size = size;
this .max = max;
this .min = min;
this .isBST = isBST;
}
}
function largestBST(root) {
// Base cases : When tree is empty or it has one child.
if (root == null ) {
return new nodeInfo(0, MIN, MAX, true );
}
if (root.left == null && root.right == null ) {
return new nodeInfo(1, root.data, root.data, true );
}
// Recur for left subtree and right subtrees
var left = largestBST(root.left);
var right = largestBST(root.right);
// Create a return variable and initialize its size.
var returnInfo = new nodeInfo();
// If whole tree rooted under current root is BST.
if (left.isBST && right.isBST && left.max < root.data && right.min > root.data) {
returnInfo.min = Math.min(Math.min(left.min, right.min), root.data);
returnInfo.max = Math.max(Math.max(left.max, right.max), root.data);
// Update answer for tree rooted under current 'root'
returnInfo.size = left.size + 1 + right.size;
returnInfo.isBST = true ;
return returnInfo;
}
// If whole tree is not BST, return maximum of left and right subtrees
returnInfo.size = Math.max(left.size, right.size);
returnInfo.isBST = false ;
return returnInfo;
}
// Return the size of the largest sub-tree which is also a BST
function largestBst(root) {
return largestBST(root).size;
}
/*
* Let us construct the following Tree
60
/
65 70
/
50
*/
var node1 = new Node(60);
node1.left = new Node(65);
node1.right = new Node(70);
node1.left.left = new Node(50);
document.write( "Size of the largest BST is " + largestBst(node1) + "" );
// This code is contributed by Rajput-Ji
</script>


输出

 Size of the largest BST is 2

时间复杂性: O(n) 本文由 舒巴姆·古普塔 .如果你喜欢GeekSforgek,并想贡献自己的力量,你也可以使用 写极客。组织 或者把你的文章寄去评论-team@geeksforgeeks.org.看到你的文章出现在Geeksforgeks主页上,并帮助其他极客。 如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。

© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享