目录

  • 预备知识:二叉树基础知识
  • 例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 二叉树定义 1.2 二叉树的构造 2.路径总和 II 2.1 题目描述 2.2 算法思路 2.3 C++实现 3.二叉树的最近公共祖先 3.1 题目描述 3.2 解题思 ...

  2. 数据结构与算法思维导图(学习笔记)

    版本 数据结构与算法思维导图V1.0 V1.0分享版本这个可以直接看,不需要下载. 说明 1.free 2.目前内容主要包含内容包含: 数据结构与算法思维导图 包含:线性表.顺序结构.链式结构,栈与队 ...

  3. 数据结构与算法--二叉树第k个大的节点

    二叉树第k个大的节点 二叉树文章列表: 数据结构与算法–面试必问AVL树原理及实现 数据结构与算法–二叉树的深度问题 数据结构与算法–二叉堆(最大堆,最小堆)实现及原理 数据结构与算法–二叉查找树转顺 ...

  4. 数据结构与算法-- 二叉树中和为某一值的路径

    二叉树中和为某一值的路径 题目:输入一颗二叉树和一个整数,打印出二叉树中节点值的和为给定值的所有路径.从树的根节点开始往下一只到叶子节点所经过的节点形成一条路径. 我们用二叉树节点的定义沿用之前文章中 ...

  5. 数据结构与算法-- 二叉树后续遍历序列校验

    二叉树后续遍历序列校验 题目:输入一个整数数组,判断改数组是否是某个二叉搜索树的后续遍历结果,如果是返回true否则false,假设输入数组的任意两个数字不相同. 例如输入{5,7,6,9,11,10 ...

  6. javascript数据结构与算法--二叉树遍历(中序)

    javascript数据结构与算法--二叉树遍历(中序) 中序遍历按照节点上的键值,以升序访问BST上的所有节点 代码如下: /**二叉树中,相对较小的值保存在左节点上,较大的值保存在右节点中*** ...

  7. 数据结构与算法学习笔记——图 C++实现

    数据结构与算法学习笔记--图 C++实现 1 概念 2 图的表示方法 3 算法 3.1 拓扑排序 3.2 图的搜索算法 3.2.1 广度优先搜索(BFS) 3.2.2 深度优先搜索(DFS) 3.3 ...

  8. python基础教程第三版豆瓣-数据结构与算法必读书单吐血整理推荐【附网盘链接】...

    前言:技术书阅读方法论 一.速读一遍(最好在1~2天内完成) 人的大脑记忆力有限,在一天内快速看完一本书会在大脑里留下深刻印象,对于之后复习以及总结都会有特别好的作用. 对于每一章的知识,先阅读标题, ...

  9. 王争数据结构与算法之美开篇问题整理

    数据结构与算法之美笔记整理 为什么大多数编程语言中数组从 0 而不是从 1 开始编号? 从数组存储的内存模型上来看,"下标"最确切的定义应该是"偏移(offset)&qu ...

最新文章

  1. [CF]Codeforces Round #529 (Div. 3)
  2. PAT 00-自测1. 打印沙漏(20)
  3. Rootkit Hunter系统检测工具
  4. 听说面试很少有人答出:距离最近点对问题
  5. php smarty ci,CI整合Smarty,cismarty_PHP教程
  6. java中PriorityQueue优先级队列使用方法
  7. 12. Copy all parts of an object
  8. 搭建离线版keras中文文档
  9. vmlogin效果怎么样?亚马逊防关联超级浏览器,电商多账号管理神器
  10. 数据库的基本语句(mysql举例)
  11. Android重力感应器入门介绍
  12. 波士顿动力机器狗签约世界第一马戏团!
  13. 网络爬虫笔记【4】 掌握获取 Ajax 异步加载网页内容的方法
  14. 如何在IGV上使用BLAT搜索非模式物种
  15. 用python写一个纪念日计算工具!有对象的特别注意了!
  16. dwg文件怎么打开呢?dwg是啥呢?
  17. Arduino录音时间延长_如何用arduino设计出可以语音播报的数字时钟
  18. Cisco Anyconnect 导致 wsl2 网络连接异常问题处理
  19. Docker:网络模式详解
  20. Windows内网穿透远程桌面:公网远程桌面控制内网电脑 2/3

热门文章

  1. php中获取随机数的方法,PHP实现获取随机数的方法
  2. go 自定义error怎么判断是否相等_「GCTT 出品」Go 系列教程——30. 错误处理
  3. linux服务器忘记ssh密码_【Linux】配置linux服务器之间ssh不用密码访问
  4. Chess DP 思维题
  5. Feature Scaling(特征缩放)的一些方法和使用选择
  6. Java爬虫框架调研
  7. logback+slf4j作为日志系统
  8. 爬取京东评论、分词+词频统计、词云图展示
  9. SpringBoot定时器
  10. Java基础复习——继承机制