题目链接:530. 二叉搜索树的最小绝对差
要点:双指针法,如何在前中后序遍历过程中记录当下指针的前一个数据的指针?代码处理顺序:中左右、左中右、左右中,在处理完中节点信息之后添加一行pre = curr。
class Solution {
public:
int getMinimumDifference(TreeNode* root) {
TreeNode* pre = nullptr;
int result = 20000;
inorderTraversal(root, pre, result);
return result;
}
void inorderTraversal(TreeNode* node, TreeNode*& pre, int& result) {
if(node == nullptr) return;
inorderTraversal(node->left, pre, result);
if(pre != nullptr && node->val - pre->val < result) result = node->val - pre->val;
pre = node;
inorderTraversal(node->right, pre, result);
}
};
题目链接:501. 二叉搜索树中的众数
没有看视频自己想出来的。
class Solution {
public:
vector<int> findMode(TreeNode* root) {
vector<int> result;
TreeNode* pre = nullptr;
int num = 1, max_num = 0;
inorderTraversal(root, pre, result, num, max_num);
return result;
}
void inorderTraversal(TreeNode* node, TreeNode*& pre, vector<int>& vec, int& num, int& max_num) {
if(node == nullptr) return;
inorderTraversal(node->left, pre, vec, num, max_num);
if(pre != nullptr && pre->val == node->val) num++;
else num = 1;
if(max_num == num){
vec.push_back(node->val);
}
else if(max_num < num) {
max_num = num;
vec.clear();
vec.push_back(node->val);
}
pre = node;
inorderTraversal(node->right, pre, vec, num, max_num);
}
};
题目链接:236. 二叉树的最近公共祖先
后序遍历:先采集左右子树信息,才能确定当下节点是否满足条件。
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(root == nullptr || root == p || root == q) return root;
TreeNode* left = lowestCommonAncestor(root->left, p, q);
TreeNode* right = lowestCommonAncestor(root->right, p, q);
if(left != nullptr && right != nullptr) return root;
else if(left == nullptr && right != nullptr) return right;
else if (left!= nullptr && right == nullptr) return left;
else return nullptr;
}
};