算法学习之路|树的一些知识

简介: 有关树的一些知识的笔记

二叉树


对于完全二叉树,,由于其特殊的性质(第k节点的左子节点编号2k,右子节点编号2k+1),可以直接利用此性质建树:
void build(int l,int r,int rt)
{
    if(l==r)
      {
        sum[rt]=a[l];//a[i]是原数组
    return;}
        int m=(l+r)>>1;
        //递归
    build(l,m,rt<<1);
    build(m+1,r,rt<<1|1);//rt为当前节点编号
}

(线段树)

层次遍历二叉树


对于需要动态建树的问题,可以通过指针或者数组来建立节点之间的联系
struct node
{
    bool value;
    int v;
    node *left,*right;
    node():value(false),left(NULL),right(NULL){}//构造函数
};
node*root;

每次建立新节点都要申请新内存,调用一次newnode函数:

node*newnode(){return new node();}

建立根节点并向左或向右走:

    node*u=root;
    if(u->left==NULL)u->=newnode();
    u->=left;
    if(u->right==NULL)u->=newnode();
    u->=right;

邻接表和邻接矩阵


用于存储图

邻接矩阵用的二维数组在图节点数过多时很容易超出内存,但用起来方便,适合节点数较少的图或者稠密图

ai即表示从i指向j的边的权值,无此条边就可以设为无穷

 

邻接表可以用纯数组表示或者用指针,个人喜欢数组:

int n,m,i;
int u[m+1],v[m+1],w[m+!];
int first[n+1],next[m+!];
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
{
    first[i]=-1;
}
for(i=1;i<=m;i++)//关键
{
    scanf("%d%d%D",&u,&v,&w);
    next[i]=first[u[i]];
    first[u[i]]=i;
}

读取部分:

    for(int i=1;i<=n;i++)
    {
        k=first[i];
        while(k!=-1)
        {
            printf("输出内容");
            k=next[k];
        }
    }

如果待存储的图有n个节点,m条边
first数组用来存储当前读入的边的起始点,即first数组长度为n;每读入一条边,更新next数组,next数组表示:指向当前存储的边的起始点的上一条边的编号,没有上一条边就赋值-1。即每一条边都对应next数组一个值,next数组长度为m。

目录
相关文章
|
11天前
|
存储 算法
数据结构与算法学习二二:图的学习、图的概念、图的深度和广度优先遍历
这篇文章详细介绍了图的概念、表示方式以及深度优先遍历和广度优先遍历的算法实现。
27 1
数据结构与算法学习二二:图的学习、图的概念、图的深度和广度优先遍历
|
8天前
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
29 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
|
9天前
|
算法
动态规划算法学习三:0-1背包问题
这篇文章是关于0-1背包问题的动态规划算法详解,包括问题描述、解决步骤、最优子结构性质、状态表示和递推方程、算法设计与分析、计算最优值、算法实现以及对算法缺点的思考。
32 2
动态规划算法学习三:0-1背包问题
|
9天前
|
算法
动态规划算法学习四:最大上升子序列问题(LIS:Longest Increasing Subsequence)
这篇文章介绍了动态规划算法中解决最大上升子序列问题(LIS)的方法,包括问题的描述、动态规划的步骤、状态表示、递推方程、计算最优值以及优化方法,如非动态规划的二分法。
37 0
动态规划算法学习四:最大上升子序列问题(LIS:Longest Increasing Subsequence)
|
9天前
|
算法
动态规划算法学习二:最长公共子序列
这篇文章介绍了如何使用动态规划算法解决最长公共子序列(LCS)问题,包括问题描述、最优子结构性质、状态表示、状态递归方程、计算最优值的方法,以及具体的代码实现。
40 0
动态规划算法学习二:最长公共子序列
|
9天前
|
缓存 负载均衡 算法
nginx学习:配置文件详解,负载均衡三种算法学习,上接nginx实操篇
Nginx 是一款高性能的 HTTP 和反向代理服务器,也是一个通用的 TCP/UDP 代理服务器,以及一个邮件代理服务器和通用的 HTTP 缓存服务器。
17 0
nginx学习:配置文件详解,负载均衡三种算法学习,上接nginx实操篇
|
11天前
|
存储 算法 关系型数据库
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
这篇文章主要介绍了多路查找树的基本概念,包括二叉树的局限性、多叉树的优化、B树及其变体(如2-3树、B+树、B*树)的特点和应用,旨在帮助读者理解这些数据结构在文件系统和数据库系统中的重要性和效率。
13 0
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
|
11天前
|
存储 算法 数据管理
数据结构与算法学习二零:二叉排序树(BST)、平衡二叉树(AVL)
这篇文章通过需求分析、代码实现和测试验证,详细介绍了二叉排序树的创建、遍历和删除操作,以及二叉平衡树(AVL)的自平衡特性和单旋转操作,旨在提高树结构在数据管理中的效率和性能。
17 0
数据结构与算法学习二零:二叉排序树(BST)、平衡二叉树(AVL)
|
9天前
|
存储 算法
动态规划算法学习一:DP的重要知识点、矩阵连乘算法
这篇文章是关于动态规划算法中矩阵连乘问题的详解,包括问题描述、最优子结构、重叠子问题、递归方法、备忘录方法和动态规划算法设计的步骤。
42 0

热门文章

最新文章