首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何高效判断回文单链表?

l和r,就是为了处理这两种情况 而判断一个字符串是不是回文串就简单很多,不需要考虑奇偶情况,只需要「双指针技巧」,两端向中间逼近即可: bool isPalindrome(string s) {...traverse(root.right); // 后序遍历代码 } 在 学习数据结构的框架思维 中说过,链表兼具递归结构,树结构不过是链表的衍生。...二、优化空间复杂度 更好的思路是这样的: 1、先通过指针技巧汇总 中的快慢指针来找到链表的中点: ListNode slow, fast; slow = fast = head; while (fast...其实这个问题很好解决,关键在于得到p, q这两个指针位置: 这样,只要在函数 return 之前加一段代码即可恢复原先链表顺序: p.next = reverse(q); 篇幅所限,我就不写了,读者可以自己尝试一下...三、最后总结 首先,寻找回文串是从中间向两端扩展,判断回文串是两端向中间收缩。 对于单链表,无法直接倒序遍历,可以造一条新的反转链表,可以利用链表的后序遍历,也可以用栈结构倒序处理单链表。

86610

如何判断回文链表

而判断一个字符串是不是回文串就简单很多,不需要考虑奇偶情况,只需要「双指针技巧」,两端向中间逼近即可: func isPalindrome( s string)bool { str:=[]rune...其实,借助二叉树后序遍历的思路,不需要显式反转原始链表也可以倒序遍历链表,下面来具体聊聊。...traverse(root.right) // 后序遍历代码 } 在「学习数据结构的框架思维」中说过,链表兼具递归结构,树结构不过是链表的衍生。...二、优化空间复杂度 更好的思路是这样的: 1、先通过「双指针技巧」中的快慢指针找到中点 var head,slow, fast *ListNode for fast !...三、最后总结 首先,寻找回文串是从中间向两端扩展,判断回文串是两端向中间收缩。对于单链表,无法直接倒序遍历,可以造一条新的反转链表,可以利用链表的后序遍历,也可以用栈结构倒序处理单链表。

86220
您找到你想要的搜索结果了吗?
是的
没有找到

二叉树非递归版的后序遍历算法

主要讨论二叉树的非递归版后序遍历该如何实现,包括借助什么样的数据结构,迭代的构思过程等。...那么,如此递归结构,该如何思考写出非递归算法呢? ?...A 我们还是坚持定义出发,不管一颗多么复杂的二叉树,在后序遍历中,一定先遍历的节点都位于节点2这一枝上,如图所示,所以我们会沿着2这一枝往下遍历,一直找,一直入栈,直到找到一个没有左孩子的节点,假设为节点...需要用到一个指针存储着上一迭代的访问过的节点。 以上就是后序遍历非递归版的思路。 05—实现代码 这里我们以二叉树为例,讨论二叉树的后序遍历的非递归版实现。...我们先看下二叉树的节点TreeNode的数据结构定义。 节点的数据域的类型定义为泛型 T,含有左、右子树,及一个带有数据域的构造函数

1.2K100

数据结构和算法学习指南

整体到细节,自顶向下,抽象到具体的框架思维是通用的,不只是学习数据结构和算法,学习其他任何知识都是高效的。 先说数据结构,然后再说算法。...「散列表」就是通过散列函数把键映射到一个大数组里。...综上,数据结构种类很多,甚至你也可以发明自己的数据结构,但是底层存储无非数组或者链表,二者的优缺点如下: 数组由于是紧凑连续存储,可以随机访问,通过索引快速找到对应元素,而且相对节约存储空间。...{ // 迭代访问 arr[i] } } 链表遍历框架,兼具迭代和递归结构: /* 基本的单链表节点 */ class ListNode { int val;...三、算法刷题指南 首先要明确的是,数据结构是工具,算法是通过合适的工具解决特定问题的方法。也就是说,学习算法之前,最起码得了解那些常用的数据结构,了解它们的特性和缺陷。

67740

【数据结构】【算法】二叉树、二叉排序树、树的相关操作

,只要得到了它的根节点指针(引用),就可以通过链表结构访问到二叉树中的每一个节点。...因为二叉树本身就是递归结构,所以这3种遍历算法也都是以递归形式定义的。...对二叉树中每一层节点的访问都按照从左到右的顺序进行。 在遍历时,需要一个队列作为辅助工具,具体步骤如下: 将二叉树的根结点指针入队列。 将队首的指针元素出队列并利用这个指针访问该节点。...因此AVL树查找一个节点的时间复杂度为 O(\log_2n) 。 来两道算法题 计算二叉树的深度 ---- 编写一个程序,计算二叉树的深度。...而根节点的左子树和右子树本身也是二叉树,所以计算它们的叶子节点数量的方法与上题中的方法相同,这样就找到了该问题的递归结构。 如果二叉树为null,则叶子节点的数量为0。

39530

数据结构和算法学习指南

整体到细节,自顶向下,抽象到具体的框架思维是通用的,不只是学习数据结构和算法,学习其他任何知识都是高效的。 先说数据结构,然后再说算法。...「散列表」就是通过散列函数把键映射到一个大数组里。...「树」,用数组实现就是「堆」,因为「堆」是一个完全二叉树,用数组存储不需要节点指针,操作也比较简单;用链表实现就是很常见的那种「树」,因为不一定是完全二叉树,所以不适合用数组存储。...{ // 迭代访问 arr[i] } } 链表遍历框架,兼具迭代和递归结构: /* 基本的单链表节点 */ class ListNode { int val;...三、算法刷题指南 首先要明确的是,数据结构是工具,算法是通过合适的工具解决特定问题的方法。也就是说,学习算法之前,最起码得了解那些常用的数据结构,了解它们的特性和缺陷。

35040

【算法】499- 数据结构和算法学习指南

整体到细节,自顶向下,抽象到具体的框架思维是通用的,不只是学习数据结构和算法,学习其他任何知识都是高效的。 先说数据结构,然后再说算法。...「散列表」就是通过散列函数把键映射到一个大数组里。...「树」,用数组实现就是「堆」,因为「堆」是一个完全二叉树,用数组存储不需要节点指针,操作也比较简单;用链表实现就是很常见的那种「树」,因为不一定是完全二叉树,所以不适合用数组存储。...{ // 迭代访问 arr[i] } } 链表遍历框架,兼具迭代和递归结构: /* 基本的单链表节点 */ class ListNode { int val;...三、算法刷题指南 首先要明确的是,数据结构是工具,算法是通过合适的工具解决特定问题的方法。也就是说,学习算法之前,最起码得了解那些常用的数据结构,了解它们的特性和缺陷。

42310

数据结构入门到精通——二叉树的实现

二叉树的实现 前言 二叉树是一种常见的数据结构,每个节点最多有两个子节点,通常称为左子节点和右子节点。实现二叉树通常涉及定义节点类(包含数据和指向子节点的指针)以及相应的插入、删除和查找操作。...概念中可以看出,二叉树定义是递归式的,因此后序基本操作中基本都是按照该概念实现的。 二、二叉树的遍历 2.1 前序、中序以及后序遍历 学习二叉树结构,最简单的方式就是遍历。...按照规则,二叉树的遍历有:前序/中序/后序的递归结构遍历: 前序遍历(Preorder Traversal 亦称先序遍历)——访问根结点的操作发生在遍历其左右子树之前。...具体来说,根节点开始,先访问所有相邻的子节点,然后逐层向下遍历,每访问一层的节点,就转向下一层,直到遍历完所有节点。这种遍历方法常用于二叉树、多叉树和图等数据结构。...二叉树是每个节点最多有两个子节点的树结构,通常子节点被称为“左子节点”和“右子节点”。二叉树的节点个数是指树中所有节点的总数,包括根节点、内部节点(非叶子节点)和叶子节点。

11410

【算法总结】五道常见的算法-二叉树

慢慢得,我发现算法也是一个可以通过练习慢慢成长的。 首先我们要掌握基本的数据结构,数组,链表,哈希表, Set,二叉树,堆,栈等。...特别地,在函数实现时,因为解决大问题的方法和解决小问题的方法往往是同一个方法,所以就产生了函数调用它自身的情况,这也正是递归的定义所在。...格外重要的是,这个解决问题的函数必须有明确的结束条件,否则就会导致无限递归的情况 而在树当中,一棵树要么是空树,要么有两个指针,每个指针指向一棵树。树是一种递归结构,很多树的问题可以使用递归来处理。...最小深度是根节点到最近叶子节点的最短路径上的节点数量。...Invert Binary Tree (Easy) 翻转一棵二叉树 思路与算法 这是一道很经典的二叉树问题。显然,我们根节点开始,递归地对树进行遍历,并从叶子结点先开始翻转。

94110

5.1二叉搜索树基础

前言:本文通过通过了解一些二叉树基础知识,然后在转向学习二分搜索树。 1 树 1.1 树的定义 树(Tree)是n(n>=0)个节点的有限集。n=0时称为空树。...图2.1展示了一棵一般二叉树结构: ? 2.2 二叉树特点  由二叉树定义以及图示分析得出二叉树有以下特点: (1)每个节点最多有两颗子树,所以二叉树中不存在度大于2的节点。...2.2.1 特性 1.二叉树具有天然的递归结构 这是由于,每个节点的左子树与右子树都是二叉树(有的情况下),如图: ? 2.2.2 二分树类型(展示) 类型1: ? 类型2: ? 类型3: ?...3.3二分搜索树的思想: 二叉排序树的查找过程和次优二叉树类似,通常采取二叉链表作为二叉排序树的存储结构。...每次插入的新的结点都是二叉排序树上新的叶子结点,在进行插入操作时,不必移动其它结点,只需改动某个结点的指针,由空变为非空即可。搜索,插入,删除的复杂度等于树高,O(log(n)),后续逐一进行学习。

55620

有多少人真正会递归?

前言 对数据结构与算法有所了解的童鞋,一定对递归(recursion)并不陌生,事实上递归在计算机领域中发挥重要的作用,是很多算法和数据结构的基础,无论是排序算法(归并排序、快速排序),还是对于一些比如树的数据结构...本文主要通过二叉树介绍递归。 递归 ? ? 递归是指在函数的定义中使用函数自身的方法。比较典型的例子就是斐波拉契数列 f(n) = f(n - 1) + f(n - 2),n ≥ 2。 ?...二叉树 ? 二叉树是天然的递归结构。其定义是:如果一个节点,它有左右两个孩子,且左右孩子都是一颗二叉树,则就存在一棵以该节点为根的二叉树。...定义中可看出定义的是二叉树,但在定义里用二叉树来定义二叉树。因此二叉树的定义本身就是递归的定义。如下图示。 ? ? ? 04. 二叉树的最大深度 ? 给定一个二叉树,找出其最大深度。...解题思路 由于二叉树具有天然的递归性,所以可以通过递归去做, 可以分别计算当前节点的左右子树的最大深度,然后取两者的最大值再加 1(当前节点的深度),就是这颗二叉树的最大深度。

49220

【数据结构和算法】--- 二叉树(3)--二叉树链式结构的实现(1)

由于现在大家对二叉树结构掌握还不够深入,且为了方便后面的介绍,此处手动快速创建一棵简单的二叉树,快速进入二叉树操作学习,等二叉树结构了解的差不多时,我们反过头再来研究二叉树真正的创建方式。...基于二叉树的链式结构,于是可以先malloc动态开辟出二叉树的每个节点并初始化,然后通过节点中的指针struct BinaryTreeNode* left(指向左树)和struct BinaryTreeNode...其余二叉树的概念还请回顾:【数据结构和算法】—二叉树(1)–树概念及结构 概念中可以看出,二叉树定义是递归式的,因此后序基本操作中基本都是按照该概念实现的。...下图可以理解为是二叉树的前序遍历: 按照规则,二叉树的遍历有:前序/中序/后序的递归结构遍历: 前序遍历(Preorder Traversal 亦称先序遍历)——访问根结点的操作发生在遍历其左右子树之前...通过上面对各种遍历方法和递归思想的讲解,相信使用递归来真正创建二叉树也不难了,如下: // 通过前序遍历的数组"ABD##E#H##CF##G##"构建二叉树 BTNode* BinaryTreeCreate

6410

数据结构与算法

常见的数据结构 线性表 链表是一个线性结构,同时也是一个天然的递归结构,链表增加了节点的指针域,空间开销比较大。 循环单链表是链表的最后一个节点指向第一个节点,构成一个链环。...双向链表是节点中包含两个指针部分,一个指向前驱元,一个指向后继元。 栈和队列 栈是一个线性结构,只能在某一端添加或删除数据,遵循先进后出的原则。...树与二叉树 树,是由n个有限节点组成一个具有层次关系的集合,是一种非常重要的数据结构。...二叉树,是每个节点最多拥有两个子节点,分别为左节点和右节点。 二叉查找树,也叫二叉排序树,二叉搜索树。...与二叉树的区别在于每个节点的值都比他的左子树大,比右子树小 图 图,是一种比树更为复杂的数据结构

36620

【数据结构】关于二叉树你不得不会的操作--实现链式二叉树超详解

前言 本章将讲解: 二叉树的概念以及各种接口实现 注:这里我们不会像之前数据结构那样去学习二叉树的增删查改,二叉树不是一个线性结构,并不适合用来储存数据,也就是增删查改并不适合它,这里我们主要是在它本身的性质上拓展...即用链来指示元素的逻辑关系 通常的方法: 链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址 链式结构分类 : 链式结构又分为二叉链和三叉链...由于对二叉树结构掌握还不够深入,为了降低学习成本,这里手动快速创建一棵简单的二叉树,快速进入二叉树操作学习,检验操作的正确性(等深入了解后再来学习二叉树真正的创建方式) 图示对应二叉树逻辑结构...,也是二叉树上进行其它运算的基础 遍历分类: 二叉树的遍历有前序/中序/后序的递归结构遍历: 前序遍历(Preorder Traversal 亦称先序遍历)——先访问根结点,再遍历其左子树,后遍历右子树...1,层序遍历就是所在二叉树的根节点出发,首先访问第一层的树根节点,然后从左到右访问第2层上的节点,接着是第三层的节点 以此类推,自上而下,自左至右逐层访问树的结点的过程就是层序遍历 逻辑示图:

39130

玩转Mysql系列 - 第22篇:mysql索引原理详解

mysql中的页 mysql中和磁盘交互的最小单位称为页,页是mysql内部定义的一种数据结构,默认为16kb,相当于4个磁盘块,也就是说mysql每次磁盘中读取一次数据是16KB,要么不读取,要读取就是...我们迫切需要这样的数据结构和算法: 需要一种数据存储结构:当磁盘中检索数据的时候能,够减少磁盘的io次数,最好能够降低到一个稳定的常量值 需要一种检索算法:当磁盘中读取磁盘块的数据之后,这些块中可能包含多条记录...,这点比数组好 链表的缺点: 无法向数组那样,通过下标随机访问数据 查找数据需第一个节点开始遍历,不利于数据的查找,查找时间和无需数据类似,需要全遍历,最差时间是O(N) 二叉查找树 二叉树是每个结点最多有两个子树的树结构...平衡二叉树相对于二叉树来说,树的左右比较平衡,不会出现二叉树那样退化成链表的情况,不管怎么插入数据,最终通过一些调整,都能够保证树左右高度相差不大于1。...B-树相对于avl树,通过在节点中增加节点内部数据的个数来减少磁盘的io操作。

95820

二叉树的链式存储结构

---- 二叉树的链式存储结构:: 1.创建一颗二叉树 #include #include #include #include<stdbool.h...3.前序、中序以及后序遍历 学习二叉树结构,最简单的方式就是遍历,所谓二叉树遍历(Traversal)是按照某种特定的规则,依次对二叉树的节点进行相应的操作,并且每个节点只操作一次。...按照规则,二叉树的遍历有:前序、中序、后序的递归结构遍历: 1.前序遍历(PreOrder Traversal 亦称先序遍历):访问根节点的操作发生在遍历其左右子树之前 2.中序遍历(InOrder...设二叉树的根节点所在 层数为 1 ,层序遍历就是所在二叉树的根节点出发,首先访问第一层的树根节点,然后从左到右访问第 2 层 上的节点,接着是第三层的节点,以此类推,自上而下,自左至右逐层访问树的结点的过程就是层序遍历...); TreeSize(root->right); return count; } //遍历计数的缺陷: //全局变量 //调用时依旧要注意 count初始化一下 因为生命周期在全局 作用域在这个函数

35120

数据结构——二叉树

(ps: 是log以2 为底,n+1为对数) 对于具有n个结点的完全二叉树,如果按照从上至下左至右的数组顺序对所有节点0开始编号,则对 于序号为i的结点有: 1.若i>0,i位置节点的双亲序号...二叉树一般可以使用两种结构存储,一种顺序结构,一种链式结构。...通常的方法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址 。链式结构又分为二叉链和三叉链。...3.2 二叉树的遍历 二叉树的遍历有:前序/中序/后序的递归结构遍历: 1.前序遍历(Preorder Traversal 亦称先序遍历)——访问根结点的操作发生在遍历其左右子树之前。...3.4.1 通过前序遍历的数组"ABD##E#H##CF##G##"构建二叉树 TreeNode* createTree(TreeNode *root,char *str,int *ps) {

7710

计算机二级Python公共基础部分

二叉树性质 ··· ··· 完全二叉树和满二叉树 二叉树的储存结构 与线性链表类似,用于存储二叉树中各元素的存储结点也由两部分组成:数据域和指针域。...但在二叉树中,由于每一个元素可以有两个后件(即两个子结点),因此,用于存储二叉树的存储结点的指针域有两个:一个用于指向该结点的左子结点的存储地址,称为左指针域;另一个用于指向该结点的右子结点的存储地址,...外面看只能看到对象的外部特性,即只需知道数据的取值范围 和可以对该数据施加的操作,根本无需知道数据的具体结构以及实现操作的算 法。对象的内部,即处理能力的实行和内部状态,对外是不可见的。...外面不能 直接使用对象的处理能力,也不能直接修改其内部状态,对象的内部状态只能由 其自身改变。通过对象的封装性可以实现信息隐蔽。 5)模块独立性好。...接口设计:描述软件内部、软件和协作系统之间以及软件与人之间如何通信。 过程设计:把系统结构部件转换成软件的过程性描述。工程角度来看,软件设计分两步完成,即概要设计和详细设计。

53520
领券