中级农民
- 积分
- 217
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2017-11-30
- 最后登录
- 1970-1-1
|
感谢楼主的面经!这道题传输的变量比较多和杂,用一个object兜一下或许会方便一些
- /**
- * Definition for a binary tree node.
- * struct TreeNode {
- * int val;
- * TreeNode *left;
- * TreeNode *right;
- * TreeNode(int x) : val(x), left(NULL), right(NULL) {}
- * };
- */
- class Solution {
- public:
- struct SubTreeInfo;
-
- int largestBSTSubtree(TreeNode* root) {
- int answer = 0;
- largestBST_Rec(root, &answer);
- return answer;
- }
-
- struct SubTreeInfo largestBST_Rec(TreeNode* node, int * answer){
- if(!node)return SubTreeInfo(true, 0, 0, 0);
- auto leftTreeInfo = largestBST_Rec(node->left, answer);
- auto rightTreeInfo = largestBST_Rec(node->right, answer);
-
- bool isBST = leftTreeInfo.isBST && rightTreeInfo.isBST;
-
- int leftBound = node->val, rightBound = node->val, count = 1;
-
- if(node->left){
- isBST &= (node->val > leftTreeInfo.rightBound);
- count += leftTreeInfo.count;
- leftBound = leftTreeInfo.leftBound;
- }
- if(node->right){
- isBST &= (node->val < rightTreeInfo.leftBound);
- count += rightTreeInfo.count;
- rightBound = rightTreeInfo.rightBound;
- }
-
- if(isBST)*answer = max(*answer, count);
-
- return SubTreeInfo(isBST, leftBound, rightBound, count);
- }
-
- struct SubTreeInfo{
- bool isBST;
- int leftBound, rightBound, count;
- SubTreeInfo(bool isBST_, int leftBound_, int rightBound_, int count_):
- isBST(isBST_), leftBound(leftBound_), rightBound(rightBound_), count(count_){}
- };
- };
复制代码 |
|