树
LeetCode刷题分类——树
阿清~
这个作者很懒,什么都没留下…
展开
-
《剑指offer》刷题系列——(六十五)二叉搜索树的后序遍历序列
题目思路代码class Solution: def verifyPostorder(self, postorder: List[int]) -> bool: if not postorder: return True root = postorder[-1] left = 0 while left<len(postorder)-1: if postorder[left]>原创 2020-07-25 10:03:22 · 110 阅读 · 0 评论 -
《剑指offer》刷题系列——(六十四)二叉搜索树与双向链表
题目输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。思路要求转换之后的链表是排好序的,而根据二叉搜索树的特点,使用中序遍历,可以按照从小到大的顺序访问二叉树的每个节点。在二叉树中,每个节点都有两个指向子节点的指针。在双向链表中,每个几点也有两个指针,分别指向前一个节点和后一个节点。两者之间有相似之处,如果能将二叉搜索树中原本指向左子节点的指针调整为链表中指向前一个节点的指针,原本指向右子节点的指针调整为链表中指向后一个节点的指针,原创 2020-07-23 21:37:12 · 74 阅读 · 0 评论 -
《剑指offer》刷题系列——(三十六)序列化二叉树
题目请实现两个函数,分别用来序列化和反序列化二叉树。示例:思路序列化二叉树就是将二叉树按照层序遍历输出各个节点值;反序列化二叉树是根据序列化结果(即层序遍历的结果)重新构建二叉树。有关层序遍历二叉树,一般使用队列。反序列化二叉树:也使用队列,初始时,将data列表中的第一个值删除,并作为树的根节点插入队列。当队列不为空时进入循环:队列中每次popleft()一个节点node,就要将data[ ]的中的开头两个值删除,并作为node的左右节点的值。由于data中保存了某些null节点,原创 2020-07-11 15:08:51 · 105 阅读 · 0 评论 -
《剑指offer》刷题系列——(三十五)二叉树中和为某一值的路径
题目输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。示例:给定如下二叉树,以及目标和 sum = 22,思路回溯法,先序遍历既要记录每条路径上的节点,也要更新当前sum值rec(root,sum)函数:先访问根节点root,然后把根节点加入到path[ ]中保存,同时更新sum=sum-root.val,然后从root的左子树和右子树中寻找符合当前sum值得路径。临界条件:当root为空时,说明访问到了叶原创 2020-07-11 11:07:49 · 154 阅读 · 0 评论 -
《剑指offer》刷题系列——(三十一) 树的子结构
题目输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)B是A的子结构, 即 A中有出现和B相同的结构和节点值。思路遇到这个题,我们的比较思路是,从A的根节点开始,寻找与B的根节点值相同的节点,如果找到了,那么这个节点作为根节点形成的树就有可能包含B的结构。当我们找到这个可能的节点,再将它的结构与B进行比较。我们需要完成两个过程,分别定义在两个函数中,一个是在A中查找可能包含B的子结构isSubStructure(),另一个是比较该子结构与B树是否含有相同的结构com原创 2020-07-10 16:09:45 · 112 阅读 · 0 评论 -
《剑指offer》刷题系列——(三十) 二叉树的最近公共祖先
题目给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。思路我们首先能想到的是,当以root为根节点进行查找时,如果p或者q刚好等于root,那么p和q的最近公共祖先就是root。那如果p或者q都不等于root怎么办呢?这种情况下就是要从root的左右子树中寻找p和q。运用递归思路。整个递归过程实际是查找root的左右子树中是否有p和q节点,查找结果分为下面四种情况:如果左右子树中都找不到p和q。就返回空;如果左子树找不到,右子树能找到,就返回右子树的查找结果;如果左子树能找到,原创 2020-07-09 14:32:02 · 132 阅读 · 0 评论 -
《剑指offer》刷题系列——(二十九)二叉搜索树的最近公共祖先
题目给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。思路树为二叉搜索树 ,树的所有节点的值都是唯一 的,且满足左子树的值都小于根节点的值,右子树的值都大于根节点的值。对于p和q的位置关系有以下几种情况:如果p的值等于root或者q的值等于root,那么p和q的最近公共祖先是root;如果p和q位于位于root的异侧,则p和q的最近公共祖先就是root;如果p和q位于位于root的同侧,就从p和q所在的一侧开始递归查找。代码# Definition for a binary t原创 2020-07-09 11:27:40 · 148 阅读 · 0 评论 -
《剑指offer》刷题系列——(二十八) 平衡二叉树
题目输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。思路在上一题求 二叉树的深度 中,我们已经掌握了求一棵树深度的方法,因此本题可以利用求深度的方法,判断树中每个节点的左右子树的深度差是否不超过1。代码# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x#原创 2020-07-09 10:43:52 · 139 阅读 · 0 评论 -
《剑指offer》刷题系列——(二十七) 二叉树的深度
题目输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。思路二叉树的深度要包含根节点,根节点的深度为1。所以二叉树的深度为左右子树深度的最大值加1。利用递归实现。如果根节点为空,深度为0。代码# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x#原创 2020-07-08 11:00:15 · 96 阅读 · 0 评论 -
《剑指offer》刷题系列——(二十六) 二叉搜索树的第k大节点
题目给定一棵二叉搜索树,请找出其中第k大的节点。思路二叉搜索树,也叫二叉排序树、二叉查找树,它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉搜索树。要找出树所有节点中的第K大值,最好的方法是能将树中所有节点进行排序,然后就很容易找到第K大的数。根据二叉搜索树的特点,如果对树进行中序遍历,则能得到所有节点的递增序列,中序遍历的过程是,先访问左子树原创 2020-07-08 10:24:30 · 106 阅读 · 0 评论 -
《剑指offer》刷题系列——(二十五) 从上到下打印二叉树 III
题目请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。思路代码复杂度...原创 2020-07-07 22:26:15 · 74 阅读 · 0 评论 -
《剑指offer》刷题系列——(二十四)重建二叉树
题目输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如,给出前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7]思路前序遍历是先访问根节点,然后访问左子节点,再访问右子节点;中序遍历是先访问左子节点,然后访问根节点,再访问右子节点;以上面的树为例,要重建二叉树,前序遍历的第一个值3就是树的根节点的值,然后在中序遍历中找到节点3,则中序遍历中节点3左边的元素构成3的左原创 2020-07-07 15:59:52 · 113 阅读 · 0 评论 -
《剑指offer》刷题系列——(二十三) 从上到下打印二叉树 II
题目从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。例如,给定二叉树:返回其层次遍历结果:[ [8], [6, 10], [5, 7, 9, 11] ]思路代码# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right原创 2020-07-07 14:48:37 · 143 阅读 · 0 评论 -
《剑指offer》刷题系列——(二十二) 从上到下打印二叉树 I
题目从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。思路考查二叉树顺序遍历,使用队列实现。上面的表格是整个操作过程。从中可以感受到这是一个循环的过程。循环体里的内容是:出队:队头节点出队;打印:打印出队节点的值;插入节点:如果出队节点有左右子节点,就插入它的子节点,如果没有就不操作。循环结束的条件是:队列为空代码# Definition for a binary tree node.# class TreeNode:# def __init__(se原创 2020-07-06 17:15:09 · 97 阅读 · 1 评论 -
《剑指offer》刷题系列——(二十一) 对称的二叉树
题目请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。例如,二叉树 [1,2,2,3,4,4,3] 是对称的。但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:思路如果一个树是对称的,那么它的左子树和右子树是镜像对称。两个树互为镜像的条件:(1)根节点的值相同;(2)一个树的左子树与另一个树的右子树镜像对称。采用递归的方法依次比较一个树的左子树和另一个树的右子树是否镜像。递归的结束条件:当两个树根节点的值都为空,原创 2020-07-06 14:04:57 · 99 阅读 · 0 评论 -
《剑指offer》刷题系列——(二十) 二叉树的镜像
题目请完成一个函数,输入一个二叉树,该函数输出它的镜像。输入:root = [4,2,7,1,3,6,9]输出:[4,7,2,9,6,3,1]思路采用递归的思想。镜像就是交换每个节点的左右子树。代码# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self原创 2020-07-06 09:37:30 · 123 阅读 · 0 评论