
算法—树与图论
文章平均质量分 85
算法笔记——树与图论
沉迷单车的追风少年
优快云博客专家,优快云商业化专家,官方内容合作伙伴,官方认证“人工智能领域优质创作者”,入选2023年中国开发者影响力年度榜单。
代表专栏《Diffusion Models与深度学习》、《手把手写深度学习》、《深度学习-计算机视觉》、《手把手写C++服务器》等。
展开
-
LeetCode二叉树从上至下路径问题总结(112.113.437.129)
目录LeetCode112.路径总和LeetCode113.路径总和IILeetCode437.路径总和III(双递归)LeetCode129.求根到叶子节点数字之和LeetCode112.路径总和这类从上到下的二叉树路径问题一般都是递归解决! 这道题的难点在于提前一层判断是不是能构成目标的sum值 如果放在最后一层判断的话,既要判断终止条件又要判断目标条件会比较麻烦!...原创 2020-03-11 17:11:17 · 392 阅读 · 0 评论 -
LeetCode114.二叉树展开为链表[后序遍历典例]
这道题首先要思考,肯定要用遍历二叉树,但是要用哪个遍历呢最好的方法应该是后序遍历,把根结点放在最后一步访问自底而上的方式顺序来重建链表记得将右子树备份,左子树置空;将左子树赋值给右子树,找到右子树的最后一个结点,把原来的右子树重新接上去这样可以避免最后结果右子树顺序颠倒的问题/** * Definition for a binary tree node. * st...原创 2020-03-09 11:41:36 · 315 阅读 · 0 评论 -
BST二叉搜索树(一)—从LeetCode实战中总结常用套路(700,653,98,99,938,108,96)
LeetCode98.验证二叉搜索树一开始按照题目的意思用分治递归来写,感觉模拟的没有问题,可是还是挂掉了;并且这样的复杂度最坏为N*N,太高了!/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNo...原创 2020-03-05 22:37:23 · 900 阅读 · 0 评论 -
LeetCode110.平衡二叉树
分治的思想,我们可以将每一个结点的高度都求出来,再遍历每一个结点,将每一个结点的左右子树的高度求出来作差比较即可;当然这是很明显的DP条件在里面,可以优化/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNod...原创 2020-03-04 16:37:09 · 264 阅读 · 0 评论 -
LeetCode111.二叉树最小深度
递归条件:叶子节点的定义是左孩子和右孩子都为 null 时叫做叶子节点 当 root 节点左右孩子都为空时,返回 1 当 root 节点左右孩子有一个为空时,返回不为空的孩子节点的深度 当 root 节点左右孩子都不为空时,返回左右孩子较小深度的节点值/** * Definition for a binary tree node. * struct TreeNode { *...原创 2020-03-04 15:39:27 · 357 阅读 · 0 评论 -
重建二叉树——LeetCode105&&LeetCode106
重建二叉树是经典且基础的二叉树问题,注意只能中序遍历+前序遍历或者中序遍历+后序遍历才能重建出二叉树!LeetCode105.前序遍历和中序遍历构造二叉树分治递归思路:先序遍历的顺序是根节点,左子树,右子树。中序遍历的顺序是左子树,根节点,右子树。所以我们只需要根据先序遍历得到根节点,然后在中序遍历中找到根节点的位置,它的左边就是左子树的节点,右边就是右子树的节点。生成左子树和右子...原创 2020-03-03 23:01:59 · 255 阅读 · 2 评论 -
深度优先和广度优先法求二叉树深度
目录深度优先求解,递归法:广度优先求解,双端队列法:先看LeetCode题目:其实这是最基本的一道二叉树的题目深度优先求解,递归法:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *...原创 2020-02-29 19:29:11 · 445 阅读 · 0 评论 -
二叉树基础总结
二叉树的特点:每个结点最多两颗子树; 左子树和右子树是有顺序的,次序不能任意颠倒; 及时树中某结点只有一颗子树,也要区分是左子树还是右子树;特殊二叉树斜树 所有结点只有左子树叫做左斜树; 所有结点只有右子树叫做右斜树; 每层都只有一个结点,结点的个数等于二叉树的深度; 其实就是线性表,所以线性表是二叉树的一种特殊表现形式! 满二叉树 所有分枝结点都存在左子树和右子树...原创 2020-02-29 17:49:30 · 500 阅读 · 0 评论 -
层序遍历——LeetCode实战中总结套路
目录层序遍历模板:LeetCode实战1:面试题32-I从上到下打印二叉树LeetCode实战2:1161.最大层内元素和四种常用遍历二叉树算法:前序中序后序和层序遍历:https://blog.youkuaiyun.com/qq_41895747/article/details/104552612层序遍历模板:创建一个 queue 队列,先将根节点( root )入队; 再将 qu...原创 2020-02-28 22:12:56 · 752 阅读 · 2 评论 -
常用遍历二叉树算法和LeetCode题实战汇总
目录二叉链表存储二叉树前序遍历中序遍历后序遍历层序遍历由遍历手段确定二叉树小试牛刀:LeetCode最大层内元素和二叉链表存储二叉树typedef struct BiTNode{ int data; struct BiTNode *lchild,*rchild;}BiTNode,*BiTree;后面就直接用了前序遍历规则:如果...原创 2020-02-28 11:32:55 · 821 阅读 · 2 评论 -
常用“树”的基础算法——有根树、二叉树表达、树的遍历、树的内层和
目录1. 有根树表达2. 二叉树表达3. 树的遍历1. 有根树表达 使用左子右兄弟法(left-child right-sibling representation)表示树,各个结点具有一以下信息:结点u的父结点 结点u的最左侧结点 结点u的右侧紧邻的兄弟结点//有根数的表达#include <iostream>using namespac...原创 2019-09-07 20:48:14 · 574 阅读 · 2 评论 -
常用四大最短路径算法——Floyd、Dijkstra、Bellman-Ford及其变种
Floyd算法核心思想:找到第三个点代替使两点间的距离更短核心代码就五行: //flody核心 for(int k=0;k<n;k++) for(int i=0;i<n;i++) for(int j=0;j<n;j++) if(M[i][j]>M[i][k]+M[k][j])...原创 2020-02-13 21:57:21 · 1450 阅读 · 0 评论 -
深度优先搜索、广度优先搜索及其变种
目录递归解决DFS栈解决DFS队列解决BFS递归解决DFS输入为邻接表格式顶点编号 与顶点相交的顶点数 相交的顶点编号//递归DFS/*61 2 2 32 2 3 43 1 54 1 65 1 66 0*/#include <iostream>using namespace std;static const int N = 100;...原创 2020-02-10 16:40:44 · 396 阅读 · 2 评论 -
图论——邻接表转换成邻接矩阵
邻接表输入格式:顶点号-与顶点相邻的边-与顶点相邻的顶点号抓住两者的概念简单模拟即可邻接表表示的优点:只需要与边数成正比的内存空间邻接表表示的缺点:设u的相邻的顶点数量为你,那么在调查顶点u与顶点v的关系时,需要消耗O(n)来搜索邻接表。 不过DFS和BFS只需对特定顶点的相邻顶点进行一次遍历即可,因此影响不大 难以删除有效边//邻接表转邻接矩阵/*41 ...原创 2020-02-09 23:01:38 · 1244 阅读 · 0 评论