
数据结构与算法
图 南
这个作者很懒,什么都没留下…
展开
-
剑指offer 之二叉树和为某一值的路径
""" 问题:二叉树和为某一值的路径 输入一颗二叉树的根节点和一个整数, 按字典序打印出二叉树中结点值的和为输入整数的所有路径。 路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。 思路: 1.利用栈的思想,先进后出 2.叶节点说明该节点既没有左子树也没有右子树 """ # -*- coding:utf-8 -*- class TreeNode: def __init__(self, x): self.val = x原创 2020-08-16 22:10:45 · 127 阅读 · 0 评论 -
剑指offer 之二叉搜索树的后序遍历序列
""" 问题:二叉搜索树的后序遍历序列 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。 如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。 思路: 1.后序遍历:左右根, 得知序列最后一个元素为根节点 2.中序遍历:左根右, 二叉搜索树的中序遍历为单调递增序列 3.要判断是否为二叉搜索树,即看 左<根<右 是否成立即可 """ # -*- coding:utf-8 -*- class Solution:原创 2020-08-16 21:09:02 · 121 阅读 · 0 评论 -
剑指offer 之从上到下打印二叉树
""" 问题:从上到下打印二叉树 从上往下打印出二叉树的每个节点,同层节点从左至右打印。 思路: 1.队列思想,先进先出, append() + pop(0) 2.从根节点开始循环判断左右结点 """ # -*- coding:utf-8 -*- class TreeNode: def __init__(self, x): self.val = x self.left = None self.right = None c原创 2020-08-16 20:29:42 · 158 阅读 · 1 评论 -
剑指offer 之二叉树的镜像
""" 问题:二叉树的镜像 二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9 7 5 思路: 1.利用递归思想, 不断交换树的左右结点 """ # -*- coding:utf-8 -*- class TreeNode:原创 2020-08-16 20:12:51 · 98 阅读 · 0 评论 -
剑指offer 之树的子结构
""" 问题:寻找二叉树的子结构 输入两棵二叉树A,B,判断B是不是A的子结构。 (ps:我们约定空树不是任意一个树的子结构) 思路: 1.如果B树是A树的子树,会有三种情况 a.从A的根节点开始相同 b.从A的左子树开始相同 c.从A的右子树开始相同 2.利用递归的思想分别讨论,有一种情况吻合就说明符合题意的情况 """ # -*- coding:utf-8 -*- class TreeNode: def _原创 2020-08-16 20:07:55 · 148 阅读 · 0 评论 -
剑指offer 之重构二叉树
""" 重构二叉树: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。 假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 例如输入前序遍历序列{1,2,4,7,3,5,6,8} 和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 思路: 1.前序遍历 根左右, 中序遍历 左根右, 后序遍历 左右跟 2.通过前序遍历确定根节点,通过根节点和中序遍历确定左右子树 3.递归循环,最后输出根节点 """原创 2020-08-16 19:42:03 · 139 阅读 · 0 评论 -
剑指offer 之反转链表
""" 反转链表 思路: 1.设置新的头结点,并赋值为None 2.循环往复判断是否还有结点,用指针保留下一个节点的位置, 3.将结点的指针指向它的前一个节点,最后输出新头结点的位置 """ class Solution: # 返回ListNode def ReverseList(self, pHead): # write code here if not pHead or not pHead.原创 2020-08-16 12:59:34 · 109 阅读 · 0 评论 -
剑指offer 之链表的倒数第K个结点
""" 链表的倒数第k个节点 思路:快慢指针法 1.先让快指针提前走K步 2.将快指针作为判断条件,让快慢指针同时移动 3.当快指针走到尾结点时,慢指针所指位置即是K的位置 """ class Solution: def FindKthToTail(self, head, k): slow,fast=head,head for i in range(k): if not fast:原创 2020-08-16 12:49:16 · 97 阅读 · 0 评论 -
剑指offer 之从尾到头打印链表
# -*- coding:utf-8 -*- # class ListNode: # def __init__(self, x): # self.val = x # self.next = None class Solution: # 返回从尾部到头部的列表值序列,例如[1,2,3] def printListFromTailToHead(self, listNode): # write code here if no原创 2020-08-16 12:43:06 · 97 阅读 · 0 评论 -
剑指offer 之删除链表中重复的节点
""" 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点, 重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 思路: 1.先设置新的非数字类型的头结点 2.通过循环求出相同结点的值,并赋值给变量 3.再次循环链表,如结点的值和刚才赋值变量的值相同,则跳过该节点 4.最后输出新头结点的下一个结点原创 2020-08-16 12:31:18 · 168 阅读 · 1 评论 -
剑指offer 之链表中环的入口结点
""" 链表中环的入口节点 """ class Solution: # 解法1:当两个节点的值相等时,此刻节点即为入口节点 def EntryNodeOfLoop(self, pHead): # write code here templist = [] p = pHead while p: if p in templist: return p原创 2020-08-15 20:29:25 · 106 阅读 · 0 评论 -
剑指offer 之两个链表的第一个公共结点
""" 找出链表的第一个公共节点 解法一:借助列表 解法二:两个指针 """ # 解法一 class Solution: def FindFirstCommonNode(self, pHead1, pHead2): # write code here list01 = [] list02 = [] while pHead1: list01.append(pHead1)原创 2020-08-15 18:20:06 · 104 阅读 · 0 评论 -
剑指offer 之复杂链表的复制
这是一道较为复杂的链表的经典面试题,下面直接贴出代码,欢迎大家留言交流 """ 复杂链表的复制 思路:1.先循环一遍,把原链表的各个元素复制一遍连成串 2.再循环一遍,复制原链表的随机指针,在新链表中指向对应元素 3.最后循环一遍,把原链表和新链表解链 """ # -*- coding:utf-8 -*- class RandomListNode: def __init__(self, x): self.label = x原创 2020-08-15 14:58:08 · 156 阅读 · 0 评论 -
python实现 冒泡排序,快速排序,归并排序,二分查找
冒泡排序 """ 冒泡排序 思想:冒泡排序的思想就是通过在无序的序列中,让两个相邻的元素一一对比, 小的元素左移,大的元素右移.即小的元素逐渐上浮,大的元素逐渐下沉, 一轮循环下来找到序列的最大值,重复此循环,直到给所有元素排好顺序 """ import time def bubble_sort(li): # 外层循环控制待确定位置元素的个数 for j in range(len(li) - 1, 0, -1): # 内原创 2020-08-08 10:37:25 · 341 阅读 · 0 评论