L530.二叉搜索树的最小绝对差 530. 二叉搜索树的最小绝对差 - 力扣(LeetCode)
本题要求树中任意两不同节点值之间的最小值,根据二叉搜索树的基本性质,由中序遍历左中右,左节点<中节点<右节点,一直往上推,这样,采用双指针方法,与一个数值方法,不断更新此数值的大小,若新的值比此数值小就更新,若不小则不更新,采用中序的遍历方法。
class Solution {
private:
TreeNode* pre = NULL;//定义一个空指针
int result=INT_MAX;//定义一个result的值
public:
void traversal(TreeNode* root, int& result)
{
if (root == NULL)return;
traversal(root->left, result);
if (pre != NULL)
{
result = min(result, root->val - pre->val);
}
pre = root;//保留上一个节点的root的值
traversal(root->right, result);
}
int getMinimumDifference(TreeNode* root)
{
traversal(root,result);
return result;
}
};
L501.二叉搜索树中的众数 501. 二叉搜索树中的众数 - 力扣(LeetCode)
在这里不看卡哥的视频,一直不知道如何更新vector的值,只会一步一步按照双指针判断是否相等,相等就用+1,这样来进行一个相加,看完卡哥视频,自己再写一遍加深影响。
class Solution {
private:
int count=1;//统计数出现的次数
int maxcount=0;//统计最大出现的次数
TreeNode* pre = NULL;//定义空指针
vector<int>result;
public:
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)result.push_back(root->val);
if (count > maxcount)//这一步对一开始只出现一次的数也进行了加入
{
maxcount = count;
result.clear();
result.push_back(root->val);
}
traversal(root->right);
}
vector<int> findMode(TreeNode* root)
{
traversal(root);
return result;
}
};
L236. 二叉树的最近公共祖先 236. 二叉树的最近公共祖先 - 力扣(LeetCode)
这道题有难度,看了几遍卡哥视频,才勉强看懂一点点,因为涉及了回溯,且涉及回溯就必须要用后序遍历。
class Solution {
public:
TreeNode* traversal(TreeNode* root, TreeNode* p, TreeNode* q)
{
if (root == NULL)return NULL;//如果当前判断的为空,就返回
if (root == p || root == q)return root;//说明遇到P和Q了,遇到就将p和q返回
TreeNode* left = traversal(root->left, p, q);
TreeNode* right = traversal(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;
else return NULL;
}
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q)
{
return traversal(root, p, q);
}
};