530.二叉搜索树的最小绝对差
class Solution {
int min_error = INT32_MAX;
int pre = INT32_MAX;
void mid_traversal(TreeNode* root)
{
if(root==nullptr) return;
mid_traversal(root->left);
min_error = min(min_error, abs(root->val-pre));
pre = root->val;
mid_traversal(root->right);
}
public:
int getMinimumDifference(TreeNode* root) {
mid_traversal(root);
return min_error;
}
};
501.二叉搜索树中的众数
class Solution {
int cnt = 0;
int max_cnt = 0;
vector<int> res;
TreeNode * pre = NULL;
void mid_traversal( TreeNode* root)
{
if(root==NULL) return;
mid_traversal(root->left);
// 中
if (pre == NULL) cnt = 1;
else if (pre->val == root->val) cnt++; // 与前一个节点数值相同
else cnt = 1; // 与前一个节点数值不同
pre = root; // 更新上一个节点
if (cnt == max_cnt) res.push_back(root->val); // 如果和最大值相同,放进result中
if (cnt > max_cnt) { // 如果计数大于最大值频率
max_cnt = cnt; // 更新最大频率
res.clear(); // 很关键的一步,不要忘记清空result,之前result里的元素都失效了
res.push_back(root->val);
}
mid_traversal(root->right);
}
public:
vector<int> findMode(TreeNode* root) {
mid_traversal(root);
return res;
}
};
236. 二叉树的最近公共祖先
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;
else if(left!=NULL && right == NULL) return left;
else return right;
}
};
总结:
二叉搜索数一般用中序遍历。因为这样中节点正好按数值大小顺序遍历二叉树。
530.二叉搜索树的最小绝对差 :相当于双指针。per指针指向上一个节点。在中节点求当前节点root和前一个节点pre的差值。用一个int变量记录遍历过程中的最小差值。
501.二叉搜索树中的众数 : 也是双指针。per指针指向上一个节点。在中节点判断上root的值和per的值是否相等。例外用变量cnt记录相等的次数。相等cnt加一,不等cnt重新从1开始。例外用一个max_cnt记录最大cnt。
236. 二叉树的最近公共祖先 : 这题有个很巧妙的思路。因为要求祖先,所以一定是后序遍历。对于公共祖先,有2种情况。
情况1:p和q分别为某一节点的孩子。
情况2:p是q的孩子,或q是p的孩子。
对于情况2,在后序遍历过程中,只要遇到了p或q就直接返回p或q就行。最后到根节点,一定是一边为空,一边不为空。返回不会空的节点。
对于情况1: 如果在遍历过程中遇到左右孩子返回节点都不为空的就返回当前节点。