day21 3.7 二叉树第七天
530.二叉搜索树的最小绝对差
链接: 530.二叉搜索树的最小绝对差
思路:直接计算,需要用一个pre节点记录一下cur节点的前一个节点。
class Solution {
private:
int result = INT_MAX;
TreeNode* pre;
void traversal(TreeNode* cur){
if(cur == NULL) return;
traversal(cur->left);//左
if(pre != NULL){//中
result = min(result,cur->val - pre->val);
}
pre = cur;//记录前一个
traversal(cur->right);//右
}
public:
int getMinimumDifference(TreeNode* root) {
traversal(root);
return result;
}
};
501.二叉搜索树中的众数
链接: 501.二叉搜索树中的众数
思路:中序遍历二叉搜索树等于遍历有序数组
class Solution {//这种方法其实不好想
private:
int maxCount;//最大频率
int count;//统计频率
TreeNode* pre;
vector<int> result;
void searchBST(TreeNode* cur){
if(cur == NULL) return;
searchBST(cur->left);//左
//中
if(pre == NULL){//第一个结点
count = 1;
}else if(pre->val == cur->val){//与前一个结点数值相同
count++;
}else{//与前一个结点数值不同
count = 1;
}
pre = cur;//更新上一个结点
if(count == maxCount){//如果和最大值相同,放进result中
result.push_back(cur->val);
}
if(count > maxCount){//如果计数大于最大值频率
maxCount = count;//更新最大频率
result.clear();//很关键的一步,不要忘记清空result,之前
result.push_back(cur->val);
}
searchBST(cur->right);//右
return;
}
public:
vector<int> findMode(TreeNode* root) {
count = 0;
maxCount = 0;
TreeNode* pre = NULL;//记录前一个结点
result.clear();
searchBST(root);
return result;
}
};
236. 二叉树的最近公共祖先
链接: 236. 二叉树的最近公共祖先
思路:后序遍历(左右中)就是天然的回溯过程,可以根据左右子树的返回值,来处理中节点的逻辑。如果找到一个节点,发现左子树出现结点p,右子树出现节点q,或者 左子树出现结点q,右子树出现节点p,那么该节点就是节点p和q的最近公共祖先。
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(root == q || root == p || 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;
else if(left != NULL && right == NULL) return left;
else {//(left == NULL && right == NULL)
return NULL;
}
}
};