数据结构与算法——二叉树与图
文章目录
- 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;}
};
数据结构与算法——二叉树与图相关推荐
- 数据结构与算法——二叉树与图汇总整理
目录 预备知识:二叉树基础知识 例1:路径之和2(medium)(二叉树深搜) 例2:最近的公共祖先(medium)(二叉树性质) 例3:二叉树转链表(medium)(二叉树与链表) 预备知识:二叉树 ...
- 数据结构与算法思维导图(学习笔记)
版本 数据结构与算法思维导图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 ...
- 数据结构与算法--二叉树实现原理
二叉树 二叉树(binary tree)是一棵树,其中每个节点都不能有多于两个的子节点 二叉树的一个性质是一颗平均二叉树的深度要比节点个数N小得多(重点),对二叉树的分析得出其平均深度为O(N\sqr ...
- 数据结构和算法 -- 学习导图
数据结构和算法 是作为程序员写出高效代码的基础,为了今后的两年在高效代码之路上持续精进,将按照此学习导图进行 算法和数据结构的刻意练习,同时也希望为同样有高效代码追求的伙伴们提供一条学习路径,共同进步 ...
最新文章
- Datawhale浙大分享(附投票结果)
- 超融合服务器品牌型号,蓝盾发布云平台!强势加入云计算IT行列
- python语言入门书籍推荐-入门python有什么好的书籍推荐?
- Codeforces Round #355 (Div. 2) B. Vanya and Food Processor 水题
- Thread的join方法使用解析
- 查看linux文件系统结构,linux的文件系统架构
- shell 提取sql 的字段名表名_Mysql 常用SQL语句集锦(仅学习)
- [MS bug]安装SQL Server 2008 错误:is not a valid login or you do not have permission
- 超简单将Centos的yum源更换为国内的阿里云源
- sqlserver 批量删除相同前缀名的表
- 智慧环卫管理系统解决方案
- ClearCase汇编
- php163邮箱正则,正则表达式匹配邮箱账号
- 3DMAX导出网格顶点切向量
- C语言-1024小游戏
- matlab右上角星号怎么打出来,星号怎么打出来(教你怎么输入特殊符号)
- 理财中的六大心理学效应(一)
- CLion: rsync is not installed or not avaiable in PATH on remote host
- 建立一个STM32F411RTOS
- ILP的基本编译器技术
热门文章
- LeetCode 1224. 最大相等频率(哈希)
- LeetCode 1451. 重新排列句子中的单词(桶排序)
- LeetCode 999. 车的可用捕获量
- LeetCode 914. 卡牌分组(最大公约数)
- LeetCode 378. 有序矩阵中第K小的元素(二分查找)
- lxrun不是内部或外部命令_在Win10 安装 WSL的Linux子系统,解决cmd中执行lxrun时提示“不是内部或外部命令”...
- ole db 错误 通讯链接失败_西门子PLC1200的S7通讯(同一项目下)--GET接收指令
- 自动化运维Shell课堂笔记
- 【Text_classification】 PaddlePaddle框架下出错调整到运行的实验和记录
- 别求面经了!小夕手把手教你如何斩下和选择NLP算法岗offer!(19.11.21更新)