二叉树
QxXyY
这个作者很懒,什么都没留下…
展开
-
二叉树总结
1.DFS的三种遍历顺序,特点2.BFS遍历使用两端队列(collections.deque())可以不占用额外空间,每层遍历删除头元素,将下一层子节点加入队尾3.考虑左右子树分治如最大深度=max(左子树最大深度,右子树最大深度)平衡二叉树:左子树平衡 and 右子树平衡 and 左右子树深度差<1重建二叉树:重建左子树+重建右子树4.注意搜索树的性质(左<root<右)搜索树考虑中序遍历:结果升序5.某节点路径、回溯问题,可以使用hash表储存父节点与子节点的指向关系原创 2022-02-25 03:41:07 · 502 阅读 · 0 评论 -
剑指 Offer 34. 二叉树中和为某一值的路径
思路:DFS,采用前序遍历,构建一个列表path[]来存叶子节点的路径,如果遍历到叶子节点,该路径不满足target,那么删除path中最后一个元素,同时返回上一层的父节点继续遍历如果该path满足target,将path的拷贝加入到result中class Solution: def pathSum(self, root: TreeNode, target: int) -> List[List[int]]: res=[] path=[] .原创 2022-02-23 23:01:33 · 120 阅读 · 0 评论 -
剑指68 最近公共祖先
二叉搜索树的公共祖先思路:搜索树一定是左<root<右,二分查找,root大于pq则pq公共祖先一定位于root左子树上,反之位于右子树,若pq在root两侧则root为公共祖先时间复杂度O(N)空间复杂度O(1)class Solution: def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode': while root.val原创 2022-02-23 22:39:21 · 176 阅读 · 0 评论 -
剑指32打印二叉树
剑指 Offer 32 - II. 从上到下打印二叉树 II思路:BFS(参考55)创建一个队列/列表que来储存每层节点由于需要每层打印,创建一个临时列表p来存每一层的打印结果需要一个中间变量temp储存每层遍历的节点,每次遍历更新que重置temp(这样需要额外的存储空间来储存每一层的节点)改进:用两端队列来储存节点,遍历时对队列进行操作:每次遍历,删除队列左边第一个旧节点,同时将新节点添加至队列末尾每层的循环次数为len(que),这样不需要额外存储空间class Solution:原创 2022-02-22 16:47:40 · 155 阅读 · 0 评论 -
剑指28 对称二叉树
对称二叉树思路:自顶向下递归判断左右两侧对应位置是否对称即:左空 and 右空:对称左右只有一个None:不对称左右对应节点值不等:不对称递归:左节点左子节点值=右节点右子节点值左节点右子节点值=右节点左子节点值class Solution: def isSymmetric(self, root: TreeNode) -> bool: def helper(L,R): if not L and not R:return True原创 2022-02-22 14:49:28 · 163 阅读 · 0 评论 -
剑指offer07 重建二叉树
剑指offer07 重建二叉树输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。思路:分治前序遍历:[root,[左子树前序遍历结果],[右子树前序遍历结果]]中序遍历:[[左子树中序遍历结果],root,[右子树中序遍历结果]]递归过程:root+左子树重建+右子树重建因此重点是确定每次子树重建时的范围,根据中序遍历对应索引确定前序遍历中对应子树的坐标范围class Solution: def buildT原创 2022-02-22 03:17:05 · 159 阅读 · 0 评论 -
剑指54.二叉搜索树的第 k 大节点,55.二叉树深度
54.二叉搜索树的第 k 大节点中序遍历:left→root→right的顺序递归,得到的结果是升序采用right→root→left的方式,得到降序,存在list中,最后取第k个元素改进:提前停止递归每次递归traverse(right)之后记录步数,当到达k时,表示这是第k大节点,停止递归class Solution: def kthLargest(self, root: TreeNode, k: int) -> int: self.k=k d原创 2021-12-10 18:47:53 · 230 阅读 · 0 评论