98.验证二叉搜索树
思路:搜索树左节点小于中间结点,中间小于右结点。通过中序遍历将树结点放入数组vector中判断是否是递升序列
vector<int>vec;
void dfs_mid(TreeNode* root)
{
if (root == NULL)
{
return;
}
dfs_mid(root->left);
vec.push_back(root->val);
dfs_mid(root->right);
}
bool isValidBST(TreeNode* root) {
dfs_mid(root);
for (int i = 1; i < vec.size(); i++)
{
if (vec[i - 1] >= vec[i])
return false;
}
return true;
}
530.二叉搜索树的最小绝对差
思路:将二叉树中序遍历放入vector中,此时找出数组两个差值最小的元素组合得到最小绝对差值
501.二叉搜索树中的众数
思路:前序遍历,将得到的值存入map。写一个cmp比较函数判断map中结点数字出现次数的大小。将map转化成vector数组利用排序方法对结点出现次数进行排序(从大到小),输出数组中第一个数。
unordered_map<int, int>map;
vector<int>result;
void dfs(TreeNode* root)
{
if (root == nullptr)
return;
map[root->val]++;
dfs(root->left);
dfs(root->right);
}
static bool cmp(const pair<int, int>& a, const pair<int, int>& b)
{
return a.second > b.second;
}
vector<int> findMode(TreeNode* root)
{
dfs(root);
vector<pair<int, int>>vec(map.begin(), map.end());
sort(vec.begin(), vec.end(), cmp);
result.push_back(vec[0].first);
for (int i = 1; i < vec.size(); i++)
{
if (vec[i].second == vec[0].second)
result.push_back(vec[i].first);
}
return result;
}
236. 二叉树的最近公共祖先
思路:
p,q结点分布分为以下几种:
1.左右同时为空:都不包含
2.左右不同时为空
3.左/右一边为空,另一边不空
p,q结点的有效分布分为以下几种:
1.如果当前结点是p或者q的一个则返回
2.如果当前结点是p或q,另一个结点在左子树
右子树为空返回左子树
3.如果当前结点是p或q,另一个结点在右子树
右子树为空返回左子树