算法
文章平均质量分 65
且随风前行
这个作者很懒,什么都没留下…
展开
-
逆序栈 只能使用递归函数和有限变量 理解递归才能知道怎么构造递归
stack = [1,2,3] 逆序之后就是 stack = [3,2,1]怎么实现这个功能呢?我们先写一个reverse(stack),返回逆序好的栈def reverse(stack): do something ... return stack容易发现,当栈为空时不需要返回,可以把栈为空作边界条件reverse函数又丰富了一些def reverse(stack): if not stack: return else: do原创 2020-06-01 11:38:25 · 198 阅读 · 0 评论 -
二叉树递归套路
在返回要求的信息之外还要返回一些冗余信息。根据由左右子树怎么得到这个树,来考虑需要的所有信息。暴力递归只返回了题目要求的信息,只靠这些信息,不能由左右子树得到这个树所需要的信息,可能还需要去递归左右子树的子树,这样时间复杂度就是O(N^2),而树DP的方式,时间复杂度是O(N)...原创 2020-05-28 22:25:19 · 278 阅读 · 0 评论 -
二叉树反序列化 非递归实现
生成随机二叉树并彩色打印参考这个链接前序遍历时间复杂度O(N), 额外空间复杂度O(lgN)的解法前序遍历的序列化和非序列化 递归实现# 前序序列化def serializeTree(head): if not head: return [None] strLeft = serializeTree(head.left) strRight = serializeTree(head.right) return [head.val]+strLeft+strR原创 2020-05-28 03:54:38 · 220 阅读 · 0 评论 -
链表的荷兰国旗问题 分成小中大三部分 哑节点实现
生成随机长度的链表将单向链表按某值划分成左边小、中间相等、右边大的形式。注意 给定的值是任意的。创建小,等,大3组共6个哑节点。把小于给定值的节点链接到L节点后把等于给定值的节点链接到M节点后把大于给定值的节点链接到R节点后使用哑节点, 把这三部分链表链接起来,不需要讨论某部分为空的情形,比设定头尾指针为None代码更简洁def partion(head, pivot): L = Lhead = Node(None, None) M = Mhead = Node(None, N原创 2020-05-25 23:14:13 · 129 阅读 · 0 评论 -
生成随机链表 打印链表
生成随机长度的单向链表class Node(object): def __init__(self, value=None, next=None): self.val = value self.next = next def __repr__(self): return "Node:{0.val!s}".format(self) def __str__(self): next = None if s原创 2020-05-25 18:01:31 · 495 阅读 · 0 评论 -
链表中间节点 快慢指针的基础应用
基本方法:使用快慢指针,慢指针每次向后移动一个节点,快指针移动两个节点。针对特殊要求再修改快慢指针的起始位置等细节。对数器选择:使用列表保存每个节点,直接求中间节点,比对两种方法的输出。1)输入链表头节点,奇数长度返回中点,偶数长度返回上中点def midOrUpMid(head): if not head: return slow = fast = head while fast.next and fast.next.next: slow = s原创 2020-05-25 15:01:52 · 156 阅读 · 0 评论 -
生成随机二叉树并彩色打印
定义节点class Node(object): def __init__(self, value=None, left=None, right=None): self.val = value self.left = left self.right = right def __str__(self): return 'Node:value={0.val!s}, left={0.left.val!s}, right={0.ri原创 2020-05-25 11:15:19 · 313 阅读 · 0 评论 -
树的遍历 所有遍历方式,这一篇就够了
遍历二叉树,没有头绪?参考https://blog.csdn.net/weixin_39255587/article/details/106307651打印二叉树,横向纵向 https://editor.csdn.net/md/?articleId=106323813按遍历顺序打印节点值和它的下标前序遍历def preorder(root): stack = [root] index = -1 while stack: finish = stack.pop()原创 2020-05-25 00:30:34 · 2141 阅读 · 0 评论 -
树的横向打印 纵向打印
横向打印树水平打印树,选择右中左遍历的原因。右树在根节点的上面,左树在根节点的下面,按照从上到下的顺序打印就是右中左的遍历方式。def printTree2(root, depth=0): s = '' if not root: return s sright = printTree2(root.right, depth+1) print('\033[5;30m|\033[0m '*depth+"\033[1;31m"+root.val+"\033[0原创 2020-05-24 23:52:39 · 420 阅读 · 0 评论 -
递归改写成非递归的两种套路 Python实现
递归改写成非递归的两种套路 Python实现1 模拟系统调用栈编译器使用堆栈传递函数参数、保存返回地址等、这里我们把子问题的参数都压入栈中,通过顺序判断参数对应的过程是否执行来模拟返回地址,即下步应该做什么。例子1:汉诺塔问题(属于中序遍历)汉诺塔递归解def hanoi(n, a, b, c): """ 常规的汉诺塔问题,可以直接从a到c :param n: 数量 :param a: 起始位置 :param b: 辅助位置 :param c: 目标原创 2020-05-23 22:45:38 · 1202 阅读 · 0 评论