C++ 中最大的 BST 子树
假设我们有一棵二叉树;我们必须找到它的最大子树,其中"最大"指的是子树中节点数量最多的子树。
因此,如果输入如下:
那么输出将是 3,因为在本例中,最大的 BST 子树是突出显示的那个。
为了解决这个问题,我们将遵循以下步骤 −
定义一个名为 data 的结构体,其中包含四个值:size、maxVal、minVal 和 ok,其中 ok 只能保存 true/false 值
solve(TreeNode * node)
if node is null, then &miuns;
return Data by initializing (0, infinity, -infinity, true)
left := solve(left of node)
left := solve(right of node)
Define one data called curr
curr.ok := false
if val of node >= right.minVal, then −
return curr
if val of node <= left.maxVal, then −
return curr
如果 left.ok 为真且 right.ok 为真,则 −
curr.sz := 1 + left.sz + right.sz
curr.ok := true
curr.maxVal := maximum of (val of node and right.maxVal)
curr.minVal := maximum of (val of node and left.minVal)
如果 curr.ok 为真,则 −
ret := ret 与 curr.sz 的最大值
返回 curr
在 main 方法中,执行以下操作 −
ret := 0
solve(root)
return ret
示例
让我们看下面的实现,以便更好地理解 −
#include <bits/stdc++.h> using namespace std; class TreeNode{ public: int val; TreeNode *left, *right; TreeNode(int data){ val = data; left = NULL; right = NULL; } }; void insert(TreeNode **root, int val){ queue<TreeNode*> q; q.push(*root); while(q.size()){ TreeNode *temp = q.front(); q.pop(); if(!temp->left){ if(val != NULL) temp->left = new TreeNode(val); else temp->left = new TreeNode(0); return; } else{ q.push(temp->left); } if(!temp->right){ if(val != NULL) temp->right = new TreeNode(val); else temp->right = new TreeNode(0); return; } else{ q.push(temp->right); } } } TreeNode *make_tree(vector<int< v){ TreeNode *root = new TreeNode(v[0]); for(int i = 1; i<v.size(); i++){ insert(&root, v[i]); } return root; } struct Data{ int sz; int maxVal; int minVal; bool ok; Data(){} Data(int a, int b, int c, bool d){ sz = a; minVal = b; maxVal = c; ok = d; } }; class Solution { public: int ret; Data solve(TreeNode* node){ if (!node) return Data(0, INT_MAX, INT_MIN, true); Data left = solve(node->left); Data right = solve(node->right); Data curr; curr.ok = false; if (node->val >= right.minVal) { return curr; } if (node->val <= left.maxVal) { return curr; } if (left.ok && right.ok) { curr.sz = 1 + left.sz + right.sz; curr.ok = true; curr.maxVal = max(node->val, right.maxVal); curr.minVal = min(node->val, left.minVal); } if (curr.ok) ret = max(ret, curr.sz); return curr; } int largestBSTSubtree(TreeNode* root){ ret = 0; solve(root); return ret; } }; main(){ Solution ob; vector<int< v = {10,5,15,1,8,NULL,7}; TreeNode *root= make_tree(v); cout << (ob.largestBSTSubtree(root)); }
输入
[10,5,15,1,8,null,7]
输出
3