提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
提示:以下是本篇文章正文内容,下面案例可供参考
一、530二叉搜索树的最小绝对差
class Solution {
public:
int res = INT_MAX;
TreeNode* pre = nullptr;
void getDiff(TreeNode* node) {
if (node == nullptr) return;
getDiff(node->left);
if (pre) {
res = min(res, node->val - pre->val);
}
pre = node;
getDiff(node->right);
}
int getMinimumDifference(TreeNode* root) {
getDiff(root);
return res;
}
};
二、501二叉搜索树中的众数
写了一个多小时。。。。。。。。这真的是简单题吗
class Solution {
public:
int count = 1;
int count1 = 1;
int maxCount = 1;
TreeNode* pre = nullptr;
TreeNode* pre1 = nullptr;
vector<int> res;
void getMode(TreeNode* root) {
if (root == nullptr) return;
getMode(root->left);
if (pre) {
if (root->val == pre->val) count ++;
else count = 1;
}
maxCount = max(maxCount, count);
pre = root;
getMode(root->right);
}
void generateArr(TreeNode* root) {
if (root == nullptr) return;
generateArr(root->left);
if (pre1 == nullptr) {
count1 = 1;
}
else {
if (pre1->val == root->val) {
count1 ++;
}
else {
count1 = 1;
}
}
if (count1 == maxCount) {
res.push_back(root->val);
}
pre1 = root;
generateArr(root->right);
}
vector<int> findMode(TreeNode* root) {
TreeNode* temp = root;
getMode(root);
generateArr(temp);
return res;
}
};
优化版:
class Solution {
public:
int maxCount = 0;
int count = 0;
TreeNode* pre = nullptr;
vector<int> res;
void traversal(TreeNode* cur) {
if (cur == nullptr) return;
traversal(cur->left);
if (pre == nullptr) {
count = 1;
}
else if (pre->val == cur->val) {
count ++;
}
else {
count = 1;
}
if (count == maxCount) {
res.push_back(cur->val);
}
else if (count > maxCount) {
maxCount = count;
res.clear();
res.push_back(cur->val);
}
pre = cur;
traversal(cur->right);
}
vector<int> findMode(TreeNode* root) {
traversal(root);
return res;
}
};
三、236二叉树的最近公共祖先
菜狗写法(险些超时):
class Solution {
public:
//root是不是node的Ancestor
bool isAncestor(TreeNode* root, TreeNode* node) {
//后序遍历
if (root == nullptr) {
return false;
}
bool left = isAncestor(root->left, node);
bool right = isAncestor(root->right, node);
if (root == node) {
return true;
}
return left || right;
}
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
TreeNode* res = root;
queue<TreeNode*> que;
que.push(root);
while (! que.empty()) {
TreeNode* node = que.front();
que.pop();
if (isAncestor(node, p) && isAncestor(node, q)) {
res = node;
}
if (node->left) {
que.push(node->left);
}
if (node->right) {
que.push(node->right);
}
}
return res;
}
};
优化版:
class Solution {
public:
TreeNode* traversal(TreeNode* node, TreeNode* p, TreeNode* q) {
if (node == nullptr) return node;
if (node == p || node == q) return node;
TreeNode* left = traversal(node->left, p, q);
TreeNode* right = traversal(node->right, p, q);
if (left && right) return node;
if (left) return left;
return right;
}
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
return traversal(root, p, q);
}
};
总结
二叉树进步的空间还很大。。