数据结构与算法——二叉树与图

文章目录

      • 1.预备知识
        • 1.1 二叉树定义
        • 1.2 二叉树的构造
      • 2.路径总和 II
        • 2.1 题目描述
        • 2.2 算法思路
        • 2.3 C++实现
      • 3.二叉树的最近公共祖先
        • 3.1 题目描述
        • 3.2 解题思路
        • 3.3 C++实现
      • 4.二叉树展开为链表
        • 4.1 题目描述
        • 4.2 思考
        • 4.3 C++实现
        • 4.4 解法二
        • 4.5 C++实现
      • 5.二叉树的右视图
        • 5.1 预备知识
        • 5.2 题目描述
        • 5.3 解题思路
        • 5.4 C++实现
      • 6. 课程表
        • 6.1 预备知识
          • 6.1.1 什么是图?
          • 6.1.2 图的表示
          • 6.1.3 图的深度优先遍历
          • 6.1.4 图的宽度优先遍历
        • 6.2 题目描述
        • 6.3 分析
        • 6.4 C++代码实现

1.预备知识

1.1 二叉树定义

在这里插入图片描述

1.2 二叉树的构造

在这里插入图片描述
在这里插入图片描述

2.路径总和 II

2.1 题目描述

给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。

叶子节点 是指没有子节点的节点。

2.2 算法思路

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.3 C++实现

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:vector<vector<int>> pathSum(TreeNode* root, int targetSum) {vector<vector<int>> result;vector<int> path;int path_value=0;preorder(root,path_value,targetSum,path,result);return result;}
private:void preorder(TreeNode* Node,int &path_value,int sum,vector<int> &path,vector<vector<int>> &result){if(!Node){return;}path_value+=Node->val;path.push_back(Node->val);if(path_value==sum&&Node->left==nullptr&&Node->right==nullptr){result.push_back(path);}preorder(Node->left,path_value,sum,path,result);preorder(Node->right,path_value,sum,path,result);path_value-=Node->val;path.pop_back();}
};

3.二叉树的最近公共祖先

3.1 题目描述

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

3.2 解题思路

在这里插入图片描述

3.3 C++实现

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution {
public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {vector<TreeNode*> path;vector<TreeNode*> node_p_path;vector<TreeNode*> node_q_path;int finish=0;preorder(root,p,path,node_p_path,finish);path.clear();finish=0;preorder(root,q,path,node_q_path,finish);int path_length=0;if(node_p_path.size()<node_q_path.size()){path_length=node_p_path.size();}else{path_length=node_q_path.size();}TreeNode* result=0;for(int i=0;i<path_length;i++){if(node_p_path[i]==node_q_path[i]){result=node_p_path[i];}}return result;}private:void preorder(TreeNode* Node,TreeNode* search,vector<TreeNode*>& path,vector<TreeNode*>& result,int finish){if(!Node||finish==1){return;}path.push_back(Node);if(Node==search){finish=1;result=path;}preorder(Node->left,search,path,result,finish);preorder(Node->right,search,path,result,finish);path.pop_back();}
};

4.二叉树展开为链表

4.1 题目描述

给你二叉树的根结点 root ,请你将它展开为一个单链表:
展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。
展开后的单链表应该与二叉树 先序遍历 顺序相同。

在这里插入图片描述

4.2 思考

在这里插入图片描述

4.3 C++实现

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:void flatten(TreeNode* root) {vector<TreeNode*> node_vec;preorder(root,node_vec);for(int i=1;i<node_vec.size();i++){node_vec[i-1]->left=nullptr;node_vec[i-1]->right=node_vec[i];}}
private:void preorder(TreeNode* Node,vector<TreeNode*> &node_vec){if(!Node){return;}node_vec.push_back(Node);preorder(Node->left,node_vec);preorder(Node->right,node_vec);}
};

4.4 解法二

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

4.5 C++实现

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:void flatten(TreeNode* root) {TreeNode* last=nullptr;preorder(root,last);}private:void preorder(TreeNode* Node,TreeNode* &last){if(!Node){return;}if(!Node->left&&!Node->right){last=Node;return;}TreeNode* left=Node->left;TreeNode* right=Node->right;TreeNode* left_last=nullptr;TreeNode* right_last=nullptr;if(left){preorder(left,left_last);Node->left=nullptr;Node->right=left;last=left_last;}if(right){preorder(right,right_last);if(left_last){left_last->right=right;}last=right_last;}}
};

5.二叉树的右视图

5.1 预备知识

在这里插入图片描述
在这里插入图片描述

#include <iostream>
#include<queue>
using namespace std;struct TreeNode {int val;TreeNode* left;TreeNode* right;TreeNode(int x):val(x),left(NULL),right(NULL){}
};
void BFS_print(TreeNode* root) {queue<TreeNode*> Q;Q.push(root);while (Q.size()) {TreeNode* node = Q.front();Q.pop();cout << node->val << endl;if (node->left) {Q.push(node->left);}if (node->right) {Q.push(node->right);}}
}
int main()
{TreeNode tree1(1);TreeNode tree2(11);TreeNode tree3(9);TreeNode tree4(3);TreeNode tree5(0);TreeNode tree6(2);TreeNode tree7(8);tree1.left = &tree2;tree1.right = &tree3;tree2.left = &tree4;tree2.right = &tree5;tree3.left = &tree6;tree3.right = &tree7;BFS_print(&tree1);return 0;
}

5.2 题目描述

给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。

5.3 解题思路

在这里插入图片描述

5.4 C++实现

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:vector<int> rightSideView(TreeNode* root) {vector<int> view;queue<pair<TreeNode*,int>> Q;if(root){Q.push(make_pair(root,0));}while(!Q.empty()){TreeNode *node=Q.front().first;int depth=Q.front().second;Q.pop();if(depth==view.size()){view.push_back(node->val);}else{view[depth]=node->val;}if(node->left){Q.push(make_pair(node->left,depth+1));}if(node->right){Q.push(make_pair(node->right,depth+1));}}return view;}
};

6. 课程表

6.1 预备知识

6.1.1 什么是图?

在这里插入图片描述

6.1.2 图的表示

在这里插入图片描述在这里插入图片描述

6.1.3 图的深度优先遍历

在这里插入图片描述

6.1.4 图的宽度优先遍历

在这里插入图片描述

6.2 题目描述

你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1 。

在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出,其中 prerequisites[i] = [ai, bi] ,表示如果要学习课程 ai 则 必须 先学习课程 bi 。

例如,先修课程对 [0, 1] 表示:想要学习课程 0 ,你需要先完成课程 1 。

请你判断是否可能完成所有课程的学习?如果可以,返回 true ;否则,返回 false 。

6.3 分析

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

6.4 C++代码实现

struct GraphNode{int label;vector<GraphNode*> neighbors;GraphNode(int x):label(x){};
};
class Solution {
public:bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {vector<GraphNode*> graph;vector<int> degree;for(int i=0;i<numCourses;i++){graph.push_back(new GraphNode(i));degree.push_back(0);}for(int i=0;i<prerequisites.size();i++){GraphNode* begin=graph[prerequisites[i][1]];GraphNode* end=graph[prerequisites[i][0]];begin->neighbors.push_back(end);degree[prerequisites[i][0]]++;}queue<GraphNode*> Q;for(int i=0;i<numCourses;i++){if(degree[i]==0){Q.push(graph[i]);}}while(!Q.empty()){GraphNode* node=Q.front();Q.pop();for(int i=0;i<node->neighbors.size();i++){degree[node->neighbors[i]->label]--;if(degree[node->neighbors[i]->label]==0){Q.push(node->neighbors[i]);}}}for(int i=0;i<numCourses;i++){delete graph[i];}for(int i=0;i<degree.size();i++){if(degree[i]){return false;}}return true;}
};

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Nature评论:机器学习的物理启示录——隔壁的另一条机遇之道

来源&#xff1a;AI科技评论作者&#xff1a;Don编辑&#xff1a;青暮老话说&#xff1a;隔行不取利。但时过境迁&#xff0c;目前不管是娱乐圈还是学术界&#xff0c;跨界方可大红大紫。在娱乐圈&#xff0c;相声演员客串脱口秀&#xff0c;歌手跨界演员&#xff0c;赚的钵满盆…

操作系统——文件的逻辑结构

文章目录1.文件的逻辑结构的概念1.1 按照逻辑结构的文件分类1.2 无结构文件和有结构文件的区别2 顺序文件3 索引文件4.索引顺序表1.文件的逻辑结构的概念 1.1 按照逻辑结构的文件分类 1.2 无结构文件和有结构文件的区别 2 顺序文件 3 索引文件 4.索引顺序表

操作系统——文件目录

文章目录1.文件目录知识点2. 文件分配方式3.文件的存储空间管理4.文件的基本操作5.文件共享6.文件保护7.文件系统的层次结构1.文件目录知识点 2. 文件分配方式 3.文件的存储空间管理 4.文件的基本操作 5.文件共享 6.文件保护 7.文件系统的层次结构

我们不知道答案的125个科学问题(16)群体合作行为的演化

来源&#xff1a;张林科学网博客链接地址&#xff1a;http://blog.sciencenet.cn/blog-318012-1292142.html题记&#xff1a;离Science杂志提出125个问题到今天已经过去了16个年头&#xff0c;然而我这个125个问题的系列解读仅仅进行到第16个&#xff0c;想必这125个问题自己也…

Nature:大脑空间导航研究五十年

来源&#xff1a;集智俱乐部作者&#xff1a;Isabel I. C. Low & Lisa M. Giocomo译者&#xff1a;赵雨亭 审校&#xff1a;张澳 编辑&#xff1a;邓一雪 导语老马识途的故事被人们所熟知&#xff0c;但其识途的神经机制却尚待研究。1971年&#xff0c;研究人员首次发现&am…

操作系统——磁盘

文章目录1.磁盘的结构2.磁盘调度算法3.减少磁盘延时时间的方法4.磁盘管理1.磁盘的结构 2.磁盘调度算法 3.减少磁盘延时时间的方法 4.磁盘管理

建网站如何选择好用的网站源码程序

很多新手朋友第一次建网站时候&#xff0c;如何选择一款适合的网站源码是比较困惑的问题&#xff0c;选择一款好的网站源码可以节约大量时间和金钱&#xff0c;但是由于网站源码参差不齐&#xff0c;免费的&#xff0c;收费的&#xff0c;淘宝几元钱购买的&#xff0c;几万块钱…

操作系统——设备管理

文章目录1.I/O设备的基本概念与分类2.I/O控制器3.I/O控制方式4.I/O软件层次结构5.I/O核心子系统6.假脱机技术7.设备的分配和回收8.缓冲区管理1.I/O设备的基本概念与分类 2.I/O控制器 3.I/O控制方式 4.I/O软件层次结构 5.I/O核心子系统 6.假脱机技术 7.设备的分配和回收 8.缓冲区…

95页重磅报告:全面预测未来5年趋势

来源&#xff1a;中产财富分水岭将成为未来5年中国互联网的关键词&#xff0c;从浅水区向深水区过渡&#xff0c;引发竞争格局的强弱式转化。分水岭期不存在直道竞争&#xff0c;冷静和变化成为主旋律。版权申明&#xff1a;内容来源网络&#xff0c;版权归原创者所有。除非无法…

新发现为类脑计算机开辟了道路

来源&#xff1a;ScienceAI编辑&#xff1a;萝卜皮大型自旋霍尔纳米振荡器&#xff08;SHNO&#xff09;阵列的同步&#xff0c;是实现超快非常规计算的一种有吸引力的方法。然而&#xff0c;与阵列接口、调整其单个振荡器和提供内置存储器单元仍然存在巨大的难题。瑞典哥德堡大…

互联网大脑如何产生“梦境“并形成元宇宙

作者&#xff1a;刘锋本文摘录自2019年中信出版社出版的《崛起的超级智能&#xff0c;互联网大脑如何影响科技未来》的第二章“10条规则&#xff1a;互联网大脑如何影响科技企业的命运”中的“第九条规则&#xff0c;互联网大脑梦境的构建带来产业升级”。这一节详细阐述了互联…

2022年人工智能领域发展七大趋势

来源&#xff1a;科技日报编辑&#xff1a;蒲蒲美国《福布斯》网站在近日的报道中指出&#xff0c;尽管目前很难想象机器自主决策所产生的影响&#xff0c;但可以肯定的是&#xff0c;当时光的车轮到达2022年时&#xff0c;人工智能领域新的突破和发展将继续拓宽我们的想象边界…

数据库基础知识——DQL语言(一)

文章目录1.基础查询2.条件查询3.排序查询4.常见函数4.1 单行函数4.1.1 字符函数4.1.2 数学函数4.1.3 日期函数4.1.4 流程控制函数4.1.5 其他函数4.2 分组函数/统计函数/聚合函数5.分组查询1.基础查询 语法&#xff1a; SELECT 要查询的东西 【FROM 表名】;#查询employees表中所…

周志华教授发表首届国际学习与推理联合大会IJCLR开场Keynote:探索从纯学习到学习+推理的AI...

周志华&#xff0c;毕业于南京大学&#xff0c;欧洲科学院外籍院士&#xff0c;国家杰出青年基金获得者&#xff0c;现任南京大学人工智能学院院长、南京大学计算机软件新技术国家重点实验室常务副主任、机器学习与数据挖掘研究所 (LAMDA)所长、人工智能教研室主任。2021年8月1…

第八章 指针实验

C程序实验报告 实验项目&#xff1a; 1、指针基础及指针运算 2、数据交换 3、字符串反转及字符串连接 4、数组元素奇偶排列 姓名&#xff1a;曹时仙 实验地点&#xff1a;教学楼514教室 实验时间&#xff1a;2019.6.12 一、实验目的与要求 1、掌握指针的概念和定义方法 2、掌…

大脑的学习方式如何,机器学习与生物学习的联系将提供「答案」

来源&#xff1a;ScienceAI编辑&#xff1a;凯霞准确指出神经活动如何随着学习而变化&#xff0c;不是黑白分明的。有人认为大脑中的学习或生物学习可以从优化的角度来考虑&#xff0c;这就是在计算机或机器人等人工网络中学习的方式。由卡内基梅隆大学和匹兹堡大学的研究人员共…

登顶Nature | DeepMind用AI首次实现数学领域重大进展,助力科学家证实两大猜想

来源&#xff1a;AI科技评论作者&#xff1a;杏花、莓酊编辑&#xff1a;琰琰数论是人类知识最古老的一个分支&#xff0c;然而它最深奥的秘密与其最平凡的真理是密切相连的。数学原理极易从事实中归纳出来&#xff0c;但证明却隐藏的极深。可以说数学&#xff0c;是一切科学的…

细胞如何获得秩序?除了形成细胞器,还可以发生相分离

来源&#xff1a;集智俱乐部作者&#xff1a;Viviane Callier译者&#xff1a;王百臻 审校&#xff1a;梁金 编辑&#xff1a;邓一雪 导语小小的细胞实际上是一个无比复杂的宇宙。DNA在细胞核中运筹帷幄&#xff0c;指导各种细胞器密切合作&#xff0c;产生功能各异的蛋白质。…

从人类交互通信发展简史看元宇宙发展趋势及商业价值

来源&#xff1a;科协频道从通信角度来看&#xff0c;人类社会通信方式的发展历程和趋势&#xff0c;它一共经历了以下几个阶段&#xff1a;通信方式的发展历程和趋势第一阶段几千年以前的人类通过口口相传的方式&#xff0c;实现人与人之间的通信&#xff0c;这种通信方式的深…

谷歌时间晶体登上Nature,诺奖得主重大猜想成为现实

来源&#xff1a;机器之心没有能量的供给&#xff0c;没有能量的消耗&#xff0c;它的循环运动会永远持续下去。时间晶体就像是一个「永动机」在不同状态之间永久循环往复而不消耗任何能量。来自斯坦福大学、谷歌、马克思 普朗克复杂系统物理研究所和牛津大学的研究团队声称已…