找到一个树中最大的BST subtree,题目来源:
http://leetcode.com/2010/11/largest-binary-search-tree-bst-in.html
算法: buttom-up, O(n)。
#include <iostream>
#include <climits>
using namespace std;
struct TreeNode
{
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int v): val(v){}
};
int findLargestBSTSubstree(TreeNode *p, int &min, int &max, int &maxNodes, TreeNode *&largest)
{
if(p == NULL) return 0;
int minLeft = INT_MAX, maxLeft = INT_MIN, minRight = INT_MAX, maxRight = INT_MIN;
int countLeft, countRight;
countLeft = findLargestBSTSubstree(p->left, minLeft, maxLeft, maxNodes, largest);
countRight = findLargestBSTSubstree(p->right, minRight, maxRight, maxNodes, largest);
if(countLeft != -1 && countRight != -1 && maxLeft < p->val && p->val < minRight)
{
int count = countLeft+countRight+1;
if(count > maxNodes)
{
maxNodes = count;
largest = p;
}
if(countLeft == 0)
min = p->val;
else
min = minLeft;
if(countRight == 0)
max = p->val;
else
max = maxRight;
return count;
}else
{
return -1;
}
}
int main()
{
TreeNode *root = new TreeNode(10);
root->left = new TreeNode(5);
root->right = new TreeNode(15);
root->left->left = new TreeNode(1);
root->left->right = new TreeNode(8);
root->right->right = new TreeNode(7);
int min, max, maxNodes;
TreeNode *largest;
findLargestBSTSubstree(root, min, max, maxNodes, largest);
cout << maxNodes << endl;
cout << largest->val << endl;
return 0;
}
相关题目:http://leetcode.com/2010/11/largest-binary-search-tree-bst-in_22.html