算法题
Melanie_419
这个作者很懒,什么都没留下…
展开
-
如何把二叉树转化成双向链表
题目输入一棵二元查找树,将该二元查找树换成一个排序的双向链表。ps:::二元查找树是左子树存在则左子树所有节点都小于它的根节点。右子树若存在则右子树节点均大于他的根节点。为了方便大家理解,我先回顾双向链表。双向链表,包含数据,指向上一个节点的指针,指向以一个节点的指针class Lnode(): def __init__(self): self.data=None self.next=None self.prev=None二叉树,包含根的数据,连接该节点的左子树,连接该节点的右子树原创 2020-08-17 15:29:12 · 361 阅读 · 0 评论 -
如何判断两二叉树是否相等
两棵二叉树相等是指两棵二叉树有着相同的结构,并且在相同位置的节点有相同的值。class Btree(): def __init(self): self.data=None self.lchild=None self.rchild=Nonedef isequal(t1,t2): if t1!=None and t2==None: return False if t1==None and t2!=None: return False if t1==None and t2==Non原创 2020-08-17 10:25:55 · 376 阅读 · 0 评论 -
如何从顶部开始逐层打印二叉树节点数据
前面几篇文章讲了从数组到二叉树,如arr=[1,2,3,4,5,6,7,8,9,10]到如下图所示的二叉树。如果要逐层打印节点,就是层序遍历。from collections import dequeclass Btree(): def __init__(self): self.data=None self.lchild=None self.rchild=Nonedef printlayerTree(tree): if tree==None: return None else:原创 2020-08-14 16:28:27 · 247 阅读 · 0 评论 -
二叉树的先序遍历,中序遍历和后序遍历。
先序:根左右中序:左根右后序:左右根class Btree(): def __init__(self): self.data=None self.lchild=None self.rchild=None####先序 def printfontorder(tree,re=[]): if tree==None: return re else: re.append(tree.data) printfontorder(tree.lchild) printfontorder原创 2020-08-14 15:55:39 · 217 阅读 · 0 评论 -
如何把一个有序的整数数组放到二叉树中
思路:如何将数组放进去,就要用到递归的思想啦。将数组分成两部分一部分构成左子树,一部分构成右子树。如【1,2,3,4,5,6,7,8,9,10】 6 1,2,3,4,5 7,8,9,10 6 3 912 45 78 10以此类推。便可以构成二叉树了class Bt原创 2020-08-14 11:14:16 · 695 阅读 · 2 评论 -
二叉树常用的基础知识
二叉树BinaryTree,它是有限个元素的集合,由一个称为根和两个不相交的,分别被称为左子树和右子树的二叉树组成。一些常见的基本概念:结点的度。结点所拥有子树的个数叶子结点。度为0的结点,为叶子节点。。。。。不想码了,大家随便一百度就有了写点自己想写的八八八###链式存储结构class Bintree(): def __init__(self): self.data=None self.lchild=None self.lright=None...原创 2020-08-14 10:56:47 · 111 阅读 · 0 评论 -
如何从数组中找出满足a+b=c+d的两个数对
题目:给定一个数组,判断数组中是否有两个数对(a,b)和(c,d),使得a+b=c+d,a,b,c,d是不同的元素。如果多个答案,打任意一个即可。解析:最残暴的方法就是直接四重遍历,但是,这样的话时间复杂度太高了,基本出题的意义也没了。我们可以用字典法,算法还是要用到遍历,但是,遍历的是数对。将数对的和作为键,将数对作为值。class Pair(): def __init__(self,first,second): self.first=None self.second=None self原创 2020-08-13 14:55:07 · 871 阅读 · 1 评论 -
实现LRU缓存方案的算法
什么是LRU?LRU是 least recently used 的缩写,就是指在最近最少使用。换句话说,就是在规定的缓存内,记录如浏览过的页面等,当页面超出缓存大小时,就会扔掉最早的缓存页面。解析:从LRU方案看,首先我们要有一个设定大小的数据结构,当存放新的页面时,要分成两种情况。第一种:新的页面不在当前的缓存区域,那么,接着判断这个缓存区是否已经满了,如果满了就删除最早的数据。第二种,新的页面A在当前缓存区,说明是用户重新又返回去看那个页面A,那么,存在缓存区的A需要重新拿出来,放在最前面。其他缓存原创 2020-08-13 10:55:08 · 145 阅读 · 0 评论 -
队列算法题---如何设计一个排序系统
设计一个排队序列,能够让每个进入队伍的用户看到自己在队列中所处的位置和变化,队伍中随时有人加入和退出;当有人退出影响到用户排名时,需要及时的反馈。解析:既然是排队序列,那么加入只能排在队尾。所以,他不会影响到原先所有人的排序。但是,有人退出时需要注意,队头的人和队中间的人退出才会影响用户排名,队尾的人走了,不会影响到前面所有的人。因此,我们需要构造两个类,一个用来描述客户,当前的排序,和其本身属性。另一个类用来描述排队的这个事件,如有人加入,有人离开以及实时更新当前用户排序状态。from collec原创 2020-08-12 19:40:28 · 299 阅读 · 0 评论 -
栈的相关算法问题----如何用两个栈模拟队列操作
用两个栈模拟队列,首先,要清楚两个数据结构的特点。栈是先进后出而队列是先进先出。显然,一个栈是没有办法实现队列的功能,这里我们需要一个插入栈,和一个弹出栈。插入栈执行队列的插入功能,弹出栈执行队列的弹出功能。class Stack(): def __init__(self): self.items=[] def is_empty(self): return len(self.items)==0 def pop(self): if self.is_empty(): print("栈空原创 2020-08-12 09:57:06 · 177 阅读 · 0 评论 -
栈中常见算法问题---如何用O(1)的时间复杂度求栈中最小的元素
问题三:如何用O(1)的时间复杂度求栈中最小的元素一般求一个数组,一个列表中的最值问题,我们第一反应是遍历。但是题中要求了O(1)的时间复杂度,那我们就不能采用遍历的方法,以为遍历的通常是O(N)。为了降低时间复杂度,我们就要用空间换时间。建立一个新的栈,专门用来放每次有元素入栈时的最值,最后输出最值栈的栈顶,时间复杂度满足要求。class Stack(): def __init__(self): self.items=[] def is_empty(self): return len(se原创 2020-08-11 15:57:41 · 361 阅读 · 0 评论 -
栈中常见问题---如何根据入栈序列判断可能出栈序列
问题二 如何根据入栈序列判断可能出栈序列如入栈的子序列是{1-2-3-4-5},那么出栈的顺序有可能是{3-2-5-4-1}么?当然可以啦,我们这么想,首先,栈是先进后出,一般先出栈顶的元素。那么我们依次将输入序列入栈,并判断入栈以后的栈顶元素是否等于出栈序列的第一个元素,那么就将入栈的元素pop出。最后,看入栈的所有元素是否已经pop出。并且出栈的序列是否全部划过。class Stack(): def __init__(self): self.items=[] def is_empty(se原创 2020-08-11 15:11:20 · 1436 阅读 · 0 评论 -
栈中常见的算法题---翻转栈的所有元素(1)
今天主要写一些关于栈的常见算法问题如何翻转栈的所有元素如何根据入栈序列判断可能出栈的序列如何用O(1)的时间复杂度求栈中最小的元素问题一 如何翻转栈的所有元素例如输入序列是{1,2,3,4,5},1是栈顶元素。翻转以后的栈为{5,4,3,2,1},5 为栈顶元素。NOTE:这里我们用到递归的思想,把栈底元素与放到栈顶的位置如 {51234}-{54123}-{54312}-(54321)#先定义一个栈class Stack(): def __init__(self): sel原创 2020-08-11 11:14:45 · 348 阅读 · 0 评论 -
小白超详细总结----数据结构与算法(三)
如何实现栈栈中先进去的数最后被弹出。class Stack(): def __init__(self): self.items=[]###采用数组的方式实现栈,栈空间结构连续 def is_empty(self): return len(self.items)==0 def top(self):#弹栈 if not self.is_empty(): return self.items[len(self.ite原创 2020-08-09 15:42:55 · 120 阅读 · 0 评论 -
如何把链表相邻元素翻转---python
题目:例如给定链表为1->2->3->4->5->6->7,翻转结果为2->1->4->3->6->5->7。思路:虚线指next域指向变化。改变next指向直接调换顺序。"""Created on Fri Jul 3 09:25:53 2020@author: Melanie"""class Lnode(): def __init__(self,x): self.data=x原创 2020-07-03 11:01:20 · 221 阅读 · 0 评论