530.二叉搜索树的最小绝对差
题目连接:530. 二叉搜索树的最小绝对差 - 力扣(LeetCode)
解题思路:最直接是思路就是将这个二叉树按照中序遍历成一个数组,然后再到数组里面寻找相邻两个数的最小差值。
代码实现:
class Solution {
private:
vector<int>vec;
void traversal(TreeNode* cur){
if(cur == NULL) return;
traversal(cur->left);
vec.push_back(cur->val);
traversal(cur->right);
}
public:
int getMinimumDifference(TreeNode* root) {
vec.clear();
traversal(root);
int result = INT_MAX;
if(vec.size() < 2)return 0;
for(int i = 1;i < vec.size(); i++){
result = min(result,vec[i] - vec[i-1]);
}
return result;
}
};
使用递归和双指针的思路:对这个二叉搜索树进行遍历,使用cur和pre指针,让pre指针永远指向cur的前一个节点,这样就能计算出相邻的最小差值。
1.递归结束条件:当cur指针遍历到空节点的时候则return。
2.递归函数返回类型和参数:因为要遍历整个二叉搜索树所以没有返回值,而传入的参数就是节点指针。
3.单层递归逻辑:先向左递归;定义一个result用来保存每次cur和pre所指向值的差值,将result更新为最小的值,然后再向右进行递归。直到遍历完整个二叉搜索树。
代码实现:
class Solution {
private:
int result = INT_MAX;
TreeNode *pre = NULL;
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. 二叉搜索树中的众数 - 力扣(LeetCode)
解题思路:
1、最直接想法就是将这个二叉搜索树进行中序遍历,然后保存为一个有序数组,然后再根据这个有序数组来求众数,即先遍历一遍这个有序数组,统计一下出现频率最高的元素的次数,然后再遍历一次这个数组,将出现频率等于最高出现频率的元素保存到结果数组中然后返回这个数组。
2、使用递归和双指针的解法,定义两个指针,分别是cur和pre,pre永远指向cur的前一个元素,然后定义一个变量count来进行计数,若cur->val == pre->val,则count++,若cur->val != pre->val,则count = 0。
a.递归函数的终止条件:当cur为空的时候则return。
b.递归函数的返回值和传入参数:因为这个需要遍历整个二叉树所以返回类型为void,传入的参数则是根节点。
c.单层递逻辑:因为是中序遍历所以先向左递归,然后是中间的处理操作,当count == max_count的时候,则向result里面压入cur->val,当count>max_count的时候表示当前元素出现的频率为最高频率,之前result里面保存的元素都比最新的这个元素出现的频率小,所以要清空result,然后跟新max_count,即max_count = count。然后向右进行遍历。
代码实现:
class Solution {
private:
vector<int>result;
int max_count = 0;
int count = 0;
TreeNode* pre = NULL;
void traversal(TreeNode* cur){
if(cur == NULL)return ;
traversal(cur->left);
if(pre == NULL){//cur指向第一个元素
count = 1;
}
else if(pre->val == cur->val){//pre 与cur指向的元素相等
count++;
}
else{//pre 与 cur 指向的元素不相等
count = 1;
}
pre = cur;
if(count == max_count){
result.push_back(cur->val);
}
if(count > max_count){
max_count = count;
result.clear();
result.push_back(cur->val);
}
traversal(cur->right);
}
public:
vector<int> findMode(TreeNode* root) {
count = 0;
max_count = 0;
pre = NULL;
result.clear();
traversal(root);
return result;
}
};
236.二叉树最近公共祖先
题目链接:236. 二叉树的最近公共祖先 - 力扣(LeetCode)
解题思路:采用后序遍历二叉树的方法来解决,对二叉树进行遍历,若遍历到的节点等于q或则p则向上返回该节点否则返回NULL,当一个节点的左右孩子都不为空的时候则说明这个节点是最近的公共祖先。
1、终止条件:遍历到的节点为空则返回空,为p或则q则返回当前节点。
2、递归函数返回类型和传入参数:因为返回的是节点,所以返回的是TreeNode*类型,而传入的是参数是根节点和目标节点p,q。
3、单层递归逻辑:因为是后序遍历,所以首先向左遍历,然后向右遍历,最后是中间的处理逻辑,当左右孩子都不为空的时候则返回根节点,当左孩子为空而右孩子不为空的时候返回右孩子,同理当右孩子为空左孩子不为空的时候则返回左孩子。
代码实现:
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* cur, TreeNode* p, TreeNode* q) {
if(cur == NULL) return cur;//若为空节点则返回空
if(cur == p || cur == q) return cur; //若当前节点等于p或q则返回当前节点
TreeNode* left = lowestCommonAncestor(cur->left, p , q);//向左遍历
TreeNode* right = lowestCommonAncestor(cur->right,p ,q);//向右遍历
if(left !=NULL && right!= NULL) return cur;
if(left != NULL && right ==NULL) return left;
else if(left == NULL && right != NULL)return right;
else{
return NULL;
}
}
};