二叉树常见题目2

[Algo] 二叉树常见题目2

1. 最近公共祖先LCA

BinaryTreeNode *LCA(BinaryTreeNode *root, BinaryTreeNode *a, BinaryTreeNode *b)
{
    if (root == nullptr || root == a || root == b) return root;
    BinaryTreeNode *l = LCA(root->left, a, b), *r = LCA(root->right, a, b);
    if (l == nullptr && r == nullptr) return nullptr;
    if (l != nullptr && r != nullptr) return root;
    return l == nullptr ? r : l;
}

2. 累加和为aim的所有路径

vector<vector<int>> path_list; //最终结果
vector<int> cur_path;
int cur_sum;
// 2. 累加和为aim的所有路径
void sumPath(BinaryTreeNode *root, int aim)
{
    if (root == nullptr) return;
    if (root->left == nullptr && root->right == nullptr)
    {
        // 当前节点是叶节点
        if (cur_sum + root->val == aim)
        {
            cur_path.push_back(root->val);
            path_list.push_back(cur_path);
            cur_path.pop_back();
        }
    }
    else
    {
        // 非叶节点
        cur_sum += root->val;
        cur_path.push_back(root->val);
        sumPath(root->left, aim);
        sumPath(root->right, aim);
        cur_sum -= root->val;
        cur_path.pop_back();
    }
}

3. 判断平衡二叉树

struct retStruct1
{
    int h; // 树的高度
    bool flag; // 是否是平衡二叉树
};
retStruct1 process1(BinaryTreeNode *root)
{
    if (root == nullptr) return retStruct1{0, true};
    retStruct1 ret_l = process1(root->left);
    retStruct1 ret_r = process1(root->right);
    retStruct1 ret;
    ret.flag = ret_l.flag && ret_r.flag && abs(ret_l.h - ret_r.h) <= 1;
    ret.h = max(ret_l.h, ret_r.h) + 1;
    return ret;
}
// 3. 判断平衡二叉树
bool isBBT(BinaryTreeNode *root)
{
    return process1(root).flag;
}

4. 判断搜索二叉树

struct retStruct2
{
    long long max; // 最大值
    long long min; // 最小值
    bool flag; // 是否是搜索二叉树
};
retStruct2 process2(BinaryTreeNode *root)
{
    if (root == nullptr) return retStruct2{INT64_MIN, INT64_MAX, true};
    retStruct2 ret_l = process2(root->left);
    retStruct2 ret_r = process2(root->right);
    retStruct2 ret;
    ret.max = max(max(ret_l.max, ret_r.max), (long long)root->val);
    ret.min = min(min(ret_l.min, ret_r.min), (long long)root->val);
    ret.flag = ret_l.flag && ret_r.flag && ret_l.max < root->val && ret_r.min > root->val;
    return ret;
}
// 4. 判断搜索二叉树
bool isBST(BinaryTreeNode *root)
{
    return process2(root).flag;
}

5. 打家劫舍

struct retStruct3
{
    int withMax; // 包含当前节点的最大值
    int withoutMax; // 不包含当前节点的最大值
};
retStruct3 process3(BinaryTreeNode *root)
{
    if (root == nullptr) return retStruct3{0, 0};
    retStruct3 ret_l = process3(root->left);
    retStruct3 ret_r = process3(root->right);
    return retStruct3{root->val + ret_l.withoutMax + ret_r.withoutMax, max(ret_l.withMax, ret_l.withoutMax) + max(ret_r.withMax, ret_r.withoutMax)};
}
// 5. 打家劫舍
int rob(BinaryTreeNode *root)
{
    retStruct3 result = process3(root);
    return max(result.withMax, result.withoutMax);
}
posted @ 2024-12-15 14:53  yaoguyuan  阅读(3)  评论(0编辑  收藏  举报