数据结构与算法——二叉树与图汇总整理
目录
- 预备知识:二叉树基础知识
- 例1:路径之和2(medium)(二叉树深搜)
- 例2:最近的公共祖先(medium)(二叉树性质)
- 例3:二叉树转链表(medium)(二叉树与链表)
- 预备知识:二叉树层次遍历
- 例4:侧面观察二叉树(medium)(二叉树宽搜)
- 预备知识:图的基础知识
- 例5:课程安排(有向图判断环)(medium)
预备知识:二叉树基础知识
树是n(n>=0)个节点的有限集,且这些节点满足如下关系:
(1)有且仅有一个节点没有父结点,该节点称为树的根。
(2)除根外,其余的每个节点都有且仅有一个父结点。
(3)树中的每一个节点都构成一个以它为根的树。
二叉树在满足树的条件时,满足如下条件:
每个节点最多有两个孩子(子树),这两个子树有左右之分,次序不可颠倒。
遍历:
例1:路径之和2(medium)(二叉树深搜)
class Solution {public:vector<vector<int>> pathSum(TreeNode* root, int targetSum) {vector<vector<int>>result;//存储所有满足结果的路径vector<int>path;//记录单个路径int path_value = 0;//路径上的总和preorder(root, targetSum, path_value, path, result);return result;}
private:void preorder(TreeNode* node, int& targetSum, int& path_value, vector<int>& path, vector<vector<int>>& result) {if (!node) {return;}path_value += node->val;path.push_back(node->val);if (!node->left && !node->right && path_value == targetSum) {result.push_back(path);}preorder(node->left, targetSum, path_value, path, result);preorder(node->right, targetSum, path_value, path, result);path_value -= node->val;path.pop_back();}
};
例2:最近的公共祖先(medium)(二叉树性质)
class Solution {public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {vector<TreeNode*>path;//临时栈vector<TreeNode*>node_p_path;//存储p节点路径vector<TreeNode*>node_q_path;//存储q节点路径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_len = 0;//记录较短路径的长度if (node_p_path.size() < node_q_path.size()) {path_len = node_p_path.size();}else {path_len = node_q_path.size();}TreeNode* result = 0;for (int i = 0; i < path_len; 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,//最终搜索到的search路径结果int& finish//记录是否找到,找到为1未找到为0) {if (!node || finish) {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();}
};
例3:二叉树转链表(medium)(二叉树与链表)
方法一:先遍历二叉树,将遍历到的节点存至vector中,最后连接(左节点置空;右节点指向下一元素)
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 = NULL;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);}
};
方法二:
class Solution {public:void flatten(TreeNode* root) {TreeNode* last = NULL;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 = NULL;TreeNode* right_last = NULL;//有左子树if (left) {preorder(left, left_last);node->left = NULL;node->right = left;last = left_last;}//有右子树if (right) {preorder(right, right_last);if (left_last) {left_last->right = right;}last = right_last;}}
};
预备知识:二叉树层次遍历
例4:侧面观察二叉树(medium)(二叉树宽搜)
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 (view.size() == depth) {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;}
};
预备知识:图的基础知识
例5:课程安排(有向图判断环)(medium)
方法一:深度搜索
struct GraphNode {int label;std::vector<GraphNode*> neighbors;GraphNode(int x) : label(x) {};
};
bool DFS_graph(GraphNode* node, std::vector<int>& visit) {visit[node->label] = 0;for (int i = 0; i < node->neighbors.size(); i++) {if (visit[node->neighbors[i]->label] == -1) {if (DFS_graph(node->neighbors[i], visit) == 0) {return false;}}else if (visit[node->neighbors[i]->label] == 0) {return false;}}visit[node->label] = 1;return true;
}class Solution {public:bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {std::vector<GraphNode*> graph;std::vector<int> visit;for (int i = 0; i < numCourses; i++) {graph.push_back(new GraphNode(i));visit.push_back(-1);}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);}for (int i = 0; i < graph.size(); i++) {if (visit[i] == -1 && !DFS_graph(graph[i], visit)) {return false;}}for (int i = 0; i < numCourses; i++) {delete graph[i];}return true;}
};
方法二:宽度搜索
struct GraphNode {int label;std::vector<GraphNode*> neighbors;GraphNode(int x) : label(x) {};
};
class Solution {public:bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {std::vector<GraphNode*> graph;std::vector<int> degree;for (int i = 0; i < numCourses; i++) {degree.push_back(0);graph.push_back(new GraphNode(i));}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]]++;}std::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 < graph.size(); i++) {delete graph[i];}for (int i = 0; i < degree.size(); i++) {if (degree[i]) {return false;}}return true;}
};
数据结构与算法——二叉树与图汇总整理相关推荐
- 数据结构与算法——二叉树与图
文章目录 1.预备知识 1.1 二叉树定义 1.2 二叉树的构造 2.路径总和 II 2.1 题目描述 2.2 算法思路 2.3 C++实现 3.二叉树的最近公共祖先 3.1 题目描述 3.2 解题思 ...
- 数据结构与算法思维导图(学习笔记)
版本 数据结构与算法思维导图V1.0 V1.0分享版本这个可以直接看,不需要下载. 说明 1.free 2.目前内容主要包含内容包含: 数据结构与算法思维导图 包含:线性表.顺序结构.链式结构,栈与队 ...
- 数据结构与算法--二叉树第k个大的节点
二叉树第k个大的节点 二叉树文章列表: 数据结构与算法–面试必问AVL树原理及实现 数据结构与算法–二叉树的深度问题 数据结构与算法–二叉堆(最大堆,最小堆)实现及原理 数据结构与算法–二叉查找树转顺 ...
- 数据结构与算法-- 二叉树中和为某一值的路径
二叉树中和为某一值的路径 题目:输入一颗二叉树和一个整数,打印出二叉树中节点值的和为给定值的所有路径.从树的根节点开始往下一只到叶子节点所经过的节点形成一条路径. 我们用二叉树节点的定义沿用之前文章中 ...
- 数据结构与算法-- 二叉树后续遍历序列校验
二叉树后续遍历序列校验 题目:输入一个整数数组,判断改数组是否是某个二叉搜索树的后续遍历结果,如果是返回true否则false,假设输入数组的任意两个数字不相同. 例如输入{5,7,6,9,11,10 ...
- javascript数据结构与算法--二叉树遍历(中序)
javascript数据结构与算法--二叉树遍历(中序) 中序遍历按照节点上的键值,以升序访问BST上的所有节点 代码如下: /**二叉树中,相对较小的值保存在左节点上,较大的值保存在右节点中*** ...
- 数据结构与算法学习笔记——图 C++实现
数据结构与算法学习笔记--图 C++实现 1 概念 2 图的表示方法 3 算法 3.1 拓扑排序 3.2 图的搜索算法 3.2.1 广度优先搜索(BFS) 3.2.2 深度优先搜索(DFS) 3.3 ...
- python基础教程第三版豆瓣-数据结构与算法必读书单吐血整理推荐【附网盘链接】...
前言:技术书阅读方法论 一.速读一遍(最好在1~2天内完成) 人的大脑记忆力有限,在一天内快速看完一本书会在大脑里留下深刻印象,对于之后复习以及总结都会有特别好的作用. 对于每一章的知识,先阅读标题, ...
- 王争数据结构与算法之美开篇问题整理
数据结构与算法之美笔记整理 为什么大多数编程语言中数组从 0 而不是从 1 开始编号? 从数组存储的内存模型上来看,"下标"最确切的定义应该是"偏移(offset)&qu ...
最新文章
- [CF]Codeforces Round #529 (Div. 3)
- PAT 00-自测1. 打印沙漏(20)
- Rootkit Hunter系统检测工具
- 听说面试很少有人答出:距离最近点对问题
- php smarty ci,CI整合Smarty,cismarty_PHP教程
- java中PriorityQueue优先级队列使用方法
- 12. Copy all parts of an object
- 搭建离线版keras中文文档
- vmlogin效果怎么样?亚马逊防关联超级浏览器,电商多账号管理神器
- 数据库的基本语句(mysql举例)
- Android重力感应器入门介绍
- 波士顿动力机器狗签约世界第一马戏团!
- 网络爬虫笔记【4】 掌握获取 Ajax 异步加载网页内容的方法
- 如何在IGV上使用BLAT搜索非模式物种
- 用python写一个纪念日计算工具!有对象的特别注意了!
- dwg文件怎么打开呢?dwg是啥呢?
- Arduino录音时间延长_如何用arduino设计出可以语音播报的数字时钟
- Cisco Anyconnect 导致 wsl2 网络连接异常问题处理
- Docker:网络模式详解
- Windows内网穿透远程桌面:公网远程桌面控制内网电脑 2/3