体系班第十三节

1判断完全二叉树递归做法

有四种情况:1 左树完全,右数满,且左高为右高加一

2左满 ,右满,左高为右高加一

3左满,右完全,左右高相等

4左右均满且高相等

#include<iostream>
#include<algorithm>
using namespace std;
class TreeNode {
public:
	int val;
	TreeNode* left;
	TreeNode* right;
	TreeNode(int a) :val(a), left(nullptr), right(nullptr) {};
};
struct info {
	int height;
	bool iscbt;
	bool isfull;
	info(int a,bool b,bool c):height(a),iscbt(b),isfull(c){}
};
info process(TreeNode* head)
{
	if (head == nullptr)
		return info(0, true, true);
	info leftinfo = process(head->left);
	info rightinfo = process(head->right);
	int height = max(leftinfo.height, rightinfo.height) + 1;
	bool isfull = leftinfo.isfull && rightinfo.isfull && leftinfo.height == rightinfo.height;
	bool iscbt = false;
	if (leftinfo.isfull && rightinfo.isfull && leftinfo.height - rightinfo.height == 1)
		iscbt = true;
	if (leftinfo.isfull && rightinfo.isfull && leftinfo.height ==rightinfo.height )
		iscbt = true;
	if (leftinfo.iscbt && rightinfo.isfull && leftinfo.height - rightinfo.height == 1)
		iscbt = true;
	if (leftinfo.isfull && rightinfo.iscbt && leftinfo.height == rightinfo.height)
		iscbt = true;
	return info(height, iscbt, isfull);
}
bool iscbt(TreeNode* head)
{
	if (head == nullptr)
		return true;
	return process(head).iscbt;
}

2 给定一棵二叉树的头节点head,返回这颗二叉树中最大的二叉搜索子树的头节点

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class TreeNode {
public:
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int data) : val(data), left(nullptr), right(nullptr) {}
};
struct info {
    TreeNode* node;//最大搜索子树头结点
    int maxsize;
    int min;
    int max;
    info(TreeNode *a,int b,int c,int d):node(a),maxsize(b),min(c),max(d){}
};
info* process(TreeNode* head)
{
    if (head == nullptr)
        return nullptr;
    info* leftinfo = process(head->left);
    info* rightinfo = process(head->right);
    int maxval = head->val;
    int minval = head->val;
    TreeNode* ans = nullptr;
    int size = 0;
    if (leftinfo != nullptr)
    {
        maxval = max(maxval, leftinfo->max);
        minval = min(minval, leftinfo->min);
        ans = leftinfo->node;
        size = leftinfo->maxsize;
    }
    if (rightinfo != nullptr)
    {
        maxval = max(maxval, rightinfo->max);
        minval = min(minval, rightinfo->min);
        if (rightinfo->maxsize > size)
        {
            ans = rightinfo->node;
            size = rightinfo->maxsize;
        }
    }
    //当能构成搜索二叉树时
    if((leftinfo==nullptr?true:(leftinfo->node==head->left&&leftinfo->max<head->val))
        && (rightinfo == nullptr ? true : (rightinfo->node == head->right && rightinfo->min > head->val)))
    {
       ans=head;
       //一定要记得判空
       size = (leftinfo == nullptr ? 0 : leftinfo->maxsize) + (rightinfo == nullptr ? 0 : leftinfo->maxsize) + 1;
    }
    return new info(ans, size, minval, maxval);
}
TreeNode* maxSubBSTHead2(TreeNode* head)
{
    if (head == nullptr)
        return nullptr;
    return process(head)->node;
}

3给定一棵二叉树的头节点head,和另外两个节点a和b,返回a和b的最低公共祖先

法1:用哈希表记下所有节点父节点,将一个节点不停地向上,这其中经过的节点放入一个集合中

再在另一个节点从上遍历,一遍查找是否在集合中已经存在过,找到的第一个即为答案

#include <iostream>
#include <unordered_map>
#include <unordered_set>
using namespace std;
class TreeNode {
public:
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int data) : val(data), left(nullptr), right(nullptr) {}
};
void fillmap(TreeNode* head, unordered_map<TreeNode*, TreeNode*> &map)
{
    if (head->left != nullptr)
    {
        map[head->left] = head;
        fillmap(head->left, map);
    }
    if (head->right != nullptr)
    {
        map[head->right] = head;
        fillmap(head->right, map);
    }
}
TreeNode* lowestAncestor(TreeNode* head, TreeNode* p, TreeNode* q)
{
    if (head == nullptr)
        return nullptr;
    unordered_map<TreeNode*, TreeNode*> map;//记录所有节点的父节点
    map[head] = nullptr;
    fillmap(head,map);
    unordered_set<TreeNode*> set;
    TreeNode* cur = p;
    set.insert(cur);
    while (map[cur] != nullptr)
    {
        cur = map[cur];
        set.insert(cur);
    }
    cur = q;
    while (set.find(cur) == set.end())
    {
        cur = map[cur];
    }
    return cur;
}

法二:递归套路,会聚点与x有关还是无关:无关:已经在左或右树右答案,或这棵树a,b没找全

x是答案:左发现一个,右发现一个

x本身就是a,然后左右发现了b   x本身就是b,左右发现a

#include <iostream>
using namespace std;

// 节点类
class Node {
public:
    int value;
    Node* left;
    Node* right;

    Node(int data) : value(data), left(nullptr), right(nullptr) {}
};
// 最低公共祖先函数
Node* lowestAncestor2(Node* head, Node* a, Node* b) {
    return process(head, a, b).ans;
}

// 信息结构体
struct Info {
    bool findA;
    bool findB;
    Node* ans;

    Info(bool fA, bool fB, Node* an) : findA(fA), findB(fB), ans(an) {}
};

// 处理函数
Info process(Node* x, Node* a, Node* b) {
    if (x == nullptr) {
        return Info(false, false, nullptr);
    }

    Info leftInfo = process(x->left, a, b);
    Info rightInfo = process(x->right, a, b);

    bool findA = (x == a) || leftInfo.findA || rightInfo.findA;//不要忘了x本身就是a的情况
    bool findB = (x == b) || leftInfo.findB || rightInfo.findB;
    Node* ans = nullptr;

    if (leftInfo.ans != nullptr) {
        ans = leftInfo.ans;
    }
    else if (rightInfo.ans != nullptr) {
        ans = rightInfo.ans;
    }
    else {
        if (findA && findB) {
            ans = x;
        }
    }

    return Info(findA, findB, ans);
}

4  派对的最大快乐值
 员工信息的定义如下:
class Employee {
    public int happy; // 这名员工可以带来的快乐值
    List<Employee> subordinates; // 这名员工有哪些直接下级
}
公司的每个员工都符合 Employee 类的描述。整个公司的人员结构可以看作是一棵标准的、 没有环的多叉树
树的头节点是公司唯一的老板,除老板之外的每个员工都有唯一的直接上级
叶节点是没有任何下属的基层员工(subordinates列表为空),除基层员工外每个员工都有一个或多个直接下级
这个公司现在要办party,你可以决定哪些员工来,哪些员工不来,规则:
1.如果某个员工来了,那么这个员工的所有直接下级都不能来
2.派对的整体快乐值是所有到场员工快乐值的累加
3.你的目标是让派对的整体快乐值尽量大
给定一棵多叉树的头节点boss,请返回派对的最大快乐值。

分情况:x来,x不来,定义一个结构体,保存两个值,x来时候的最大值,x不来时候的最大值

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
struct employee {
	int happy;
	vector<employee*> nexts;
	employee(int h):happy(h),nexts(){}
};
struct info {
	int yes;
	int no;
	info(int a,int b):yes(a),no(b){}
};
info process(employee* head)
{
	if (head == nullptr)
		return info(0, 0);
	int yes = head->happy;
	int no = 0;
	for (employee* a : head->nexts)
	{
		info nextinfo = process(a);
		yes += nextinfo.no;
		no += max(nextinfo.yes, nextinfo.no);
	}
	return info(yes, no);
}
int maxhappy(employee* head)
{
	info allinfo = process(head);
	return max(allinfo.no, allinfo.yes);
}

5给定一个由字符串组成的数组strs,必须把所有的字符串拼接起来,返回所有可能的拼接结果中字典序最小的结果

贪心:局部最小得全体最优解,有时候可能会有错

 字典序:字符串排大小,长度一样比数字大小

长度不同:较短的补上最小的阿斯克码值,然后与长的比较

证明过程:得先证明排序过程具有传递性 ,像石头剪刀布就没有传递性

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class compare {
public:
	bool operator()(string a, string b)
	{
		return (a + b) < (b + a);
	}
};
string lowestString(vector<string> str)
{
	if (str.empty())
		return "";
	sort(str.begin(), str.end(), compare());
	string a="";
	for (string c : str)
	{
		a += c;
	}
	return a;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/447013.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

封装方法3

上一篇处理了单元格返回值改写 这一篇处理剩余普通方法返回值改写 已经给了Object的返回值&#xff0c;需要回调 //返回结果是22个单元格的值&#xff0c;怎么给调用方 Object value getCellValue(cell);没有给调用方的情况 value值内容是什么 处理ecxel-22个单元值的返回结…

重启 explorer 进程的正确做法(二)

重启资源管理器进程的方法不唯一&#xff0c;但长期以来大家对实施方法用的不到位。 在上一篇中我认为&#xff1a;“我们往往使用 TerminateProcess 并传入 PID 和特殊结束代码 1 或者 taskkill /f /im 等方法重启资源管理器( explorer.exe )&#xff0c;其实这是不正确的。我…

神经网络实战前言

应用广泛 从人脸识别到网约车&#xff0c;在生活中无处不在 未来可期 无人驾驶技术便利出行医疗健康改善民生 产业革命 第四次工业革命——人工智能 机器学习概念 机器学习不等价与人工智能20世纪50年代&#xff0c;人工智能是说机器模仿人类行为的能力 符号人工智能 …

DevOps本地搭建笔记(个人开发适用)

需求和背景 win11 wsl2 armbian(玩客云矿渣&#xff09;&#xff0c;构建个人cicd流水线&#xff0c;提高迭代效率。 具体步骤 基础设施准备 硬件准备&#xff1a;一台笔记本&#xff0c;用于开发和构建部署&#xff0c;一台服务器&#xff0c;用于日常服务运行。 笔记本…

C#,蛇梯问题(Snake and Ladder Problem)的算法与源代码

1 蛇梯问题 Snake and Ladder Problem 给定一个蛇梯板&#xff0c;找出从源单元格或第一个单元格到达目标单元格或最后一个单元格所需的最小掷骰次数。基本上&#xff0c;玩家可以完全控制掷骰子的结果&#xff0c;并希望找出到达最后一个单元格所需的最小掷骰次数。 如果玩…

【大厂AI课学习笔记NO.76】人工智能人才金字塔

人工智能领域&#xff0c;分为源头创新人才、产业研发人才、应用开发人才和实用技能人才。 人工智能领域的人才结构呈现多样化特点&#xff0c;主要可以分为源头创新人才、产业研发人才、应用开发人才和实用技能人才四大类。这四大类人才在人工智能领域的发展中各自扮演着不可或…

Day30:安全开发-JS应用NodeJS指南原型链污染Express框架功能实现审计

目录 环境搭建-NodeJS-解析安装&库安装 功能实现-NodeJS-数据库&文件&执行 安全问题-NodeJS-注入&RCE&原型链 案例分析-NodeJS-CTF题目&源码审计 开发指南-NodeJS-安全SecGuide项目 思维导图 JS知识点&#xff1a; 功能&#xff1a;登录验证&…

常见排序算法(C/C++)--- 动画演示

本篇将介绍一些常见的排序算法&#xff0c;如插入排序&#xff1a;直接插入排序、希尔排序&#xff1b;选择排序&#xff1a;选择排序、堆排序&#xff1b;交换排序&#xff1a;快速排序、冒泡排序&#xff1b;以及最后的归并排序。 对于以上的排序算法&#xff0c;我们总结了每…

VScode的列选

可以用来优化代码排布&#xff0c;让变量整齐成为一排 一、批量复制&#xff1a; 在1处左键单击&#xff0c;然后摁住SHIFTALT键的同时&#xff0c;左键单击2处&#xff0c;即可复制一整块的内容 如果所示 就可以复制了 二、批量输入 在1处左键单击&#xff0c;然后摁住SHI…

Day32:安全开发-JavaEE应用Servlet路由技术JDBCMybatis数据库生命周期

目录 JavaEE-HTTP-Servlet&路由&周期 JavaEE-数据库-JDBC&Mybatis&库 思维导图 Java知识点&#xff1a; 功能&#xff1a;数据库操作&#xff0c;文件操作&#xff0c;序列化数据&#xff0c;身份验证&#xff0c;框架开发&#xff0c;第三方库使用等. 框架…

RabbitMQ - 04 - Fanout交换机 (广播)

目录 部署demo项目 什么是Fanout交换机 实现Fanout交换机 1.控制台 声明队列 声明交换机 将交换机与队列绑定 2.编写消费者方法 3.编写生产者测试方法 部署demo项目 通过消息队列demo项目进行练习 相关配置看此贴 http://t.csdnimg.cn/hPk2T 注意 生产者消费者的…

转移表回调函数实现

回调函数实现 计算器的模拟&#xff08;函数指针数组的使用&#xff09;&#xff08;回调函数&#xff09; 简化 冗余 老的代码的问题就是 冗余 写死 不能完成不同的任务 函数调用的时候只需要知道地址就可以 calc计算器 这里也称之为转移表 #define _CRT_SECURE_NO_WAR…

微信小程序开发系列(二十五)·wxml语法·条件渲染wx:if, wx:elif, wx:else 属性组以及hidden 属性的使用

目录 1. 使用 wx:if、wx:elif、wx:else 属性组 2. 使用 hidden 属性 条件渲染主要用来控制页面结构的展示和隐藏,在微信小程序中实现条件渲染有两种方式: 1. 使用 wx:if, wx:elif, wx:else 属性组 2. 使用 hidden 属性 wx:if 和 hidden 二者的区别&#xff1a; 1. wx…

计算机网络-第4章 网络层(2)

主要内容&#xff1a;网络层提供的两种服务&#xff1a;虚电路和数据报&#xff08;前者不用&#xff09;、ip协议、网际控制报文协议ICMP、路由选择协议&#xff08;内部网关和外部网关&#xff09;、IPv6,IP多播&#xff0c;虚拟专用网、网络地址转换NAT&#xff0c;多协议标…

背包问题算法

背包问题算法 0-1背包问题二维数组一维数组 完全背包问题二维数组一维数组 多重背包问题一维数组 0-1背包问题 问题&#xff1a;背包的容量为9&#xff0c;有重量分别为[2, 4, 6, 9]的四个物品&#xff0c;价值分别为[3, 4, 5, 6]&#xff0c;求背包能装的物品的最大价值是多少…

构建LVS集群

一、集群的基本理论&#xff08;一&#xff09;什么是集群 人群或事物聚集&#xff1a;在日常用语中&#xff0c;群集指的是一大群人或事物密集地聚在一起。例如&#xff0c;“人们群集在广场上”&#xff0c;这里的“群集”是指大量人群聚集的现象。 计算机技术中的集群&…

C语言连接【MySQL】

稍等更新图片。。。。 文章目录 安装 MySQL 库连接 MySQLMYSQL 类创建 MySQL 对象连接数据库关闭数据库连接示例 发送命令设置编码格式插入、删除或修改记录查询记录示例 参考资料 安装 MySQL 库 在 CentOS7 下&#xff0c;使用命令安装 MySQL&#xff1a; yum install mysq…

arcgis栅格数据处理3——定义投影(同样适用于其他类型文件)

进行数据连接时可能出现未设置投影无法链接的情况&#xff0c;需要先定义投影 点击最右侧“目录”&#xff0c;弹出带有系统工具的面板&#xff0c;点击“data management tools”点击“投影”&#xff0c;“定义投影”

【轮式平衡机器人】——TMS320F28069片内外设之eCAP

引入 TMS320F28069的eCAP&#xff08;增强型捕获模块&#xff09;是一个强大的外设&#xff0c;用于精确测量和捕获输入信号的事件和时间戳。 在电机控制、传感器数据采集和信号处理等应用中&#xff0c;eCAP模块可以用于测量霍尔传感器、编码器或其他数字输入信号的周期、频…

计算表达式x*(2^i)的值math.ldexp(x, i)

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 计算表达式x*(2^i)的值 math.ldexp(x, i) [太阳]选择题 关于以下代码输出的结果说法正确的是&#xff1f; import math print("【执行】math.ldexp(3,2)") print(math.ldexp(3,2)) …
最新文章