
剑指offer
剑指offer算法题 python版
追风人丶丶
这个作者很懒,什么都没留下…
展开
-
JZ78 把二叉树打印成多行
JZ78 把二叉树打印成多行描述给定一个节点数为 n 二叉树,要求从上到下按层打印二叉树的 val 值,同一层结点从左至右输出,每一层输出一行,将输出的结果存放到一个二维数组中返回。例如:给定的二叉树是{1,2,3,#,#,4,5}该二叉树多行打印层序遍历的结果是[[1],[2,3],[4,5]]数据范围:二叉树的节点数0≤n≤1000,0≤val≤1000要求:空间复杂度 O(n),时间复杂度 O(n)思路:二叉树的层序遍历:# class TreeNode:# d原创 2022-01-06 22:37:36 · 421 阅读 · 0 评论 -
JZ84 二叉树中和为某一值的路径(三)
JZ84 二叉树中和为某一值的路径(三)给定一个二叉树root和一个整数值 sum ,求该树有多少路径的的节点值之和等于 sum 。1.该题路径定义不需要从根节点开始,也不需要在叶子节点结束,但是一定是从父亲节点往下到孩子节点2.总节点数目为n3.保证最后返回的路径个数在整形范围内(即路径个数小于231-1)数据范围:0<=n<=10000<=n<=1000-109<=节点值<=109−109<=节点值<=109假如二叉树root为{1,2,3原创 2022-01-06 22:35:14 · 490 阅读 · 0 评论 -
JZ8 二叉树的下一个结点
JZ8 二叉树的下一个结点给定-*- coding:utf-8 -*-class TreeLinkNode: def __init__(self, x): self.val = x self.left = None self.right = None self.next = None找当前节点的下一节点思路:当前节点有右儿子:找右儿子的最左节点当前节点没有右儿子:找父节点,直到父节点有左孩子为止class Solu原创 2022-01-05 17:32:21 · 184 阅读 · 0 评论 -
JZ36 二叉搜索树与双向链表
JZ36 二叉搜索树与双向链表描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。如下图所示数据范围:输入二叉树的节点数 0≤n≤1000,二叉树中每个节点的值 0≤val≤1000要求:空间复杂度O(1)(即在原树上操作),时间复杂度 O(n)注意:1.要求不能创建任何新的结点,只能调整树中结点指针的指向。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继2.返回链表中的第一个节点的指针3.函数返回的TreeNode,有左右指针,其实可以看成一个双向原创 2022-01-05 16:31:26 · 164 阅读 · 0 评论 -
JZ34 二叉树中和为某一值的路径(二)
JZ34 二叉树中和为某一值的路径(二)描述输入一颗二叉树的根节点root和一个整数expectNumber,找出二叉树中结点值的和为expectNumber的所有路径。1.该题路径定义为从树的根结点开始往下一直到叶子结点所经过的结点2.叶子节点是指没有子节点的节点3.路径只能从父节点到子节点,不能从子节点到父节点4.总节点数目为n如二叉树root为{10,5,12,4,7},expectNumber为22则合法路径有[[10,5,7],[10,12]]数据范围:树中节点总数在范围 [原创 2022-01-05 15:53:19 · 186 阅读 · 0 评论 -
JZ33 二叉搜索树的后序遍历序列
JZ33 二叉搜索树的后序遍历序列描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回 true ,否则返回 false 。假设输入的数组的任意两个数字都互不相同。要求:空间复杂度 O*(n) ,时间时间复杂度 O(n^2)*提示:1.二叉搜索树是指父亲节点大于左子树中的全部节点,但是小于右子树中的全部节点的树。2.该题我们约定空树不是二叉搜索树3.后序遍历是指按照 “左子树-右子树-根节点” 的顺序遍历4.参考下面的二叉搜索树,示例 1思路:二叉搜索树:le原创 2022-01-05 15:17:15 · 126 阅读 · 0 评论 -
JZ26 树的子结构
JZ26 树的子结构 ☆☆☆描述输入两棵二叉树A,B,判断B是不是A的子结构。(我们约定空树不是任意一个树的子结构)假如给定A为{8,8,7,9,2,#,#,#,#,4,7},B为{8,9,2},2个树的结构如下,可以看出B是A的子结构数据范围:0 <= A的节点个数 <= 100000 <= B的节点个数 <= 10000示例1输入:{8,8,7,9,2,#,#,#,#,4,7},{8,9,2}返回值:true示例2输入:{1,2,3,4,5},{2,4}原创 2022-01-01 14:50:48 · 642 阅读 · 0 评论 -
JZ7 重建二叉树
JZ7 重建二叉树描述:给定节点数为 n 二叉树的前序遍历和中序遍历结果,请重建出该二叉树并返回它的头结点。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建出如下图所示。提示:vin.length == pre.lengthpre 和 vin 均无重复元素vin出现的元素均出现在 pre里只需要返回根结点,系统会自动输出整颗树做答案对比数据范围:n \le 2000n≤2000,节点的值 -10000 \l原创 2022-01-01 13:30:37 · 118 阅读 · 0 评论 -
JZ54 二叉搜索树的第k个节点
JZ54 二叉搜索树的第k个节点描述:给定一棵结点数为n 二叉搜索树,请找出其中的第 k 小的TreeNode结点值。返回第k小的节点值即可不能查找的情况,如二叉树为空,则返回-1,或者k大于n等等,也返回-1保证n个节点的值不一样思路:二叉搜索树排序的过程就是中序遍历的过程,因此代码结构与二叉树中序遍历类似,将中序遍历的结果存在数组中,返回数组第k-1个元素即可。# class TreeNode:# def __init__(self, x):#原创 2022-01-01 12:59:41 · 232 阅读 · 0 评论 -
JZ30 包含min函数的栈
JZ30 包含min函数的栈示例:输入: ["PSH-1","PSH2","MIN","TOP","POP","PSH1","TOP","MIN"]返回值:-1,2,1,-1思路:设计一个最小元素栈,pop,top操作和原栈相同,但在push操作中,最小元素栈每次push的是最小的元素。# -*- coding:utf-8 -*-class Solution: stack = [] stack2 = [] def push(self, node): s原创 2022-01-01 12:43:30 · 203 阅读 · 0 评论 -
JZ28 对称的二叉树
JZ28 对称的二叉树思路:左右子树若是对称的,则满足下面三种情况:left.val = right.valleft.left和right.right满足一定性质left.right和right.left满足一定性质# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solutio原创 2021-12-29 22:29:58 · 215 阅读 · 0 评论 -
JZ79 判断是不是平衡二叉树
JZ79 判断是不是平衡二叉树思路:很显然对于每个树的结点求左右子树的高度,先计算他们的差值,若大于1,就不是平衡二叉树,否则就是平衡二叉树。代码如下:# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution: def IsBalanced_Solution(self , pR原创 2021-12-29 22:29:25 · 233 阅读 · 0 评论 -
JZ55 二叉树的深度
题目: 跟标题一样,给定一颗链树,求二叉树的深度。直接给出代码:# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution: def TreeDepth(self , pRoot: TreeNode) -> int: if pRoot == None:原创 2021-12-29 22:28:33 · 181 阅读 · 0 评论 -
JZ76 删除链表中重复的结点
剑指offerJZ76 删除链表中重复的结点示例1输入:{1,2,3,3,4,4,5}返回值:{1,2,5}示例2输入:{1,1,1,8}返回值:{8}思路:链表题首先用dummy头作为空的头结点,方便统一处理。tail结点作为返回链表的尾结点。(dummy是不同的,遍历只是改变了tail的位置)。判断pHead、pHead.next是否相同,若不同,则 tail=pHead, tail=tail.next若相同,则pHead遍历到第一个与pHead.next不同的原创 2021-12-29 19:01:09 · 177 阅读 · 0 评论