首页 > 其他分享 >二叉树常见题目2

二叉树常见题目2

时间:2024-12-15 14:53:24浏览次数:11  
标签:题目 cur 常见 nullptr ret BinaryTreeNode 二叉树 return root

[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);
}

标签:题目,cur,常见,nullptr,ret,BinaryTreeNode,二叉树,return,root
From: https://www.cnblogs.com/yaoguyuan/p/18607991

相关文章

  • C语言中对数组进行解引用的几种常见写法
    1.对数组进行解引用1.1使用数组名+索引(常用)    该方法是最常见,也是最基本的,用数组名加下标来找到数组对应的元素intmain(){ intarr[5]={1,2,3,4,5}; intret=arr[2]; printf("%d\n",ret); return0;}    上面的代码中,数组的下标是0~4,通过arr......
  • 在 Windows 操作系统中,Runtime Broker 和 Background Task Host 是两种常见的进程和服
    在Windows操作系统中,RuntimeBroker和BackgroundTaskHost是两种常见的进程和服务,它们在后台运行并执行与系统和应用相关的一些任务。它们对于系统的正常运行非常重要,通常不需要用户干预。下面是它们的详细说明:1. RuntimeBroker是什么?RuntimeBroker是一个Windows系......
  • ENSP 各种常见配置命令
    清除烦人的打印信息undoinfo-centerenable查看完整的路由表displayiprouting-table显示所有静态路由displaycurrent-configuration|includeiproute-static配置静态路由iproute-static192.168.1.0255.255.255.0192.168.2.1交换机查看接口vlan配置display......
  • OJ题目详解——1.8~05:计算鞍点
    描述给定一个5*5的矩阵,每行只有一个最大值,每列只有一个最小值,寻找这个矩阵的鞍点。鞍点指的是矩阵中的一个元素,它是所在行的最大值,并且是所在列的最小值。例如:在下面的例子中(第4行第1列的元素就是鞍点,值为8)。11356912478101056911864721510112025......
  • OJ题目详解——1.8~06:图像相似度
    描述给出两幅相同大小的黑白图像(用0-1矩阵)表示,求它们的相似度。说明:若两幅图像在相同位置上的像素点颜色相同,则称它们在该位置具有相同的像素点。两幅图像的相似度定义为相同像素点数占总像素点数的百分比。输入第一行包含两个整数m和n,表示图像的行数和列数,中间用单个空格......
  • OJ题目详解——1.8~11:图像旋转
    描述输入一个n行m列的黑白图像,将它顺时针旋转90度后输出。输入第一行包含两个整数n和m,表示图像包含像素点的行数和列数。1<=n<=100,1<=m<=100。接下来n行,每行m个整数,表示图像的每个像素点灰度。相邻两个整数之间用单个空格隔开,每个元素均在0~255之间。输出m行,每行......
  • OJ题目详解——1.8~14:扫雷游戏地雷数计算
    描述扫雷游戏是一款十分经典的单机小游戏。它的精髓在于,通过已翻开格子所提示的周围格地雷数,来判断未翻开格子里是否是地雷。现在给出n行m列的雷区中的地雷分布,要求计算出每个非地雷格的周围格地雷数。注:每个格子周围格有八个:上、下、左、右、左上、右上、左下、右下。输入......
  • GESP二级 题目AC代码(找素数,百鸡问题,画三角形)
    找素数GESP二级23年6月循环结构#include<bits/stdc++.h>usingnamespacestd;intn,m;boolisprime(intn){ for(inti=2;i<n;i++){ if(n%i==0){ return0; } } return1;}intmain(){ cin>>n>>m; longlongcnt=0......
  • CentOS 7 常见系统符号
    CentOS7常见系统符号基础符号系列(元字符)美元符号:$用于取出变量中的内容[root@yu~]#echo$PS1[\u@\h\W]\$用于取出指定列的信息(awk)表示用户命令提示符,普通用户表示一行的结尾$(),表示命令执行结果留下,用于其它命令调用。叹号符号:!用于表......
  • 二叉树常见题目
    [Algo]二叉树常见题目1.层序遍历//1.层序遍历voidBFS(BinaryTreeNode*root){queue<BinaryTreeNode*>q;vector<BinaryTreeNode*>v;q.push(root);while(!q.empty()){while(!q.empty()){v.push_back(q.fro......