递归法:
class Solution {
public:
vector<int> vec;
void traversal(TreeNode* root) {
if(root == NULL) return;
traversal(root->left);
vec.push_back(root->val);
traversal(root->right);
}
int getMinimumDifference(TreeNode* root) {
traversal(root);
if(vec.size() < 2) return 0;
int res = INT_MAX;
for(int i = 0; i < vec.size()-1; i++) {
int dif = vec[i+1] - vec[i];
if(dif < res) {
res = dif;
}
}
return res;
}
};
迭代法:
class Solution {
public:
int getMinimumDifference(TreeNode* root) {
if(root == NULL) return 0;
vector<int> vec;
stack<TreeNode*> sta;
TreeNode* cur = root;
while(cur != NULL || !sta.empty()) {
while(cur != NULL) {
sta.push(cur);
cur = cur->left;
}
cur = sta.top();
sta.pop();
vec.push_back(cur->val);
cur = cur->right;
}
if(vec.size() < 2) return 0;
int res = INT_MAX;
for(int i = 0; i < vec.size()-1; i++) {
int dif = vec[i+1] - vec[i];
if(dif < res) {
res = dif;
}
}
return res;
}
};
递归法:
class Solution {
public:
int maxCount = 0;
int count = 0;
vector<int> vec;
TreeNode* pre = NULL;
void traversal(TreeNode* root) {
if(root == NULL) return;
traversal(root->left);
if(pre != NULL && pre->val == root->val) {
count++;
}else {
count = 1;
}
pre = root;
if(count == maxCount) {
vec.push_back(pre->val);
}else if(count > maxCount) {
vec.clear();
vec.push_back(pre->val);
maxCount = count;
}
traversal(root->right);
}
vector<int> findMode(TreeNode* root) {
if(root == NULL) return vec;
traversal(root);
return vec;
}
};
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(root == p || root == q || root == NULL) return root;
TreeNode* left = lowestCommonAncestor(root->left, p, q);
TreeNode* right = lowestCommonAncestor(root->right, p, q);
if(left != NULL && right != NULL) return root;
if(left == NULL && right != NULL) return right;
if(left != NULL && right == NULL) return left;
return NULL;
}
};