leetcode-explore-learn-数据结构-二叉树2

  • 1.概述
  • 2.自顶向下/自底向上 框架思想
  • 3.例题
    • 3.1对称二叉树
    • 3.2路径总和

本系列博文为leetcode-explore-learn子栏目学习笔记,如有不详之处,请参考leetcode官网:https://leetcode-cn.com/explore/learn/card/data-structure-binary-tree/2/traverse-a-tree/7/

所有例题的编程语言为python
二叉树节点结构:

class TreeNode(object):def __init__(self, x):self.val = xself.left = Noneself.right = None

1.概述

树结构本身是递归定义的:一个节点,包含一个值和一个指向其他节点的列表。树的许多问题可以通过递归的方式来解决。对于每一个递归层级,我们只需要关注单个节点内的问题,然后通过递归调用来解决其子节点问题。

通常通过自顶向上或者自底向上的递归来解决树的问题

递归解题,需要存在递归函数和原函数,原函数中开启递归入口,递归函数不断递归求解。

2.自顶向下/自底向上 框架思想

一道题带你理解什么是自顶向上/自底向上–二叉树的最大深度

自顶向下 :在每个递归层级上,先访问节点来计算一些值,并在递归调用时将这些值传递给子节点。自顶向下的方案可以看作是一种先序遍历

根节点的深度是1,对于一个节点其深度为x,那么我们将知道其子节点的深度。在递归调用时自顶向下的将节点的深度传递为一个参数,那么每一个节点都知道自己的深度,对于叶子节点,可以通过比较确定需不需要更新更大的深度。

class Solution(object):def __init__(self):self.res=0def maxDepth(self, root):""":type root: TreeNode:rtype: int"""def dfs_top_down(node,l):if node==None:     # root 本身就是一个空指针returnif node.left==None and node.right==None:self.res=max(self.res,l)          # 用max 需要重新定义一个全局变量dfs_top_down(node.left,l+1)dfs_top_down(node.right,l+1)dfs_top_down(root,1)return self.res

自底向上:在每个递归层级上,对所有的节点递归调用函数,然后根据返回值和根节点本身的值得到答案。自底向上的方案可以看作后序遍历

如果知道一个根节点,以其左子节点为根的最大深度为l,以其右子节点为根的最大深度为如,那么这个根节点所在子树的最大深度为max(l,r)+1max(l,r)+1max(l,r)+1(对于每个节点的答案,都可以在解决它的子节点问题的大难之后得到答案)

class Solution(object):def maxDepth(self, root):""":type root: TreeNode:rtype: int"""def dfs_bottom_up(node):if node==None:return 0left_l=dfs_bottom_up(node.left)right_l=dfs_bottom_up(node.right)return max(left_l,right_l)+1res=dfs_bottom_up(root)return res

树递归框架的思路:
自顶向上:需要使用一些参数和节点本身的值来决定传递给子节点参数
自底向上:如果知道子节点的答案就能知道该节点的答案,采用自底向上是个不错的选择

3.例题

3.1对称二叉树

给定一个二叉树,检查它是否为镜像对称
思考失败,笔记见编辑状态

核心是验证root 子树和root子树是不是镜面对称的。如果是的话,单独的一棵root树是镜面对称的。
官方求解思路递归参考:
如果一个树的左子树与右子树是镜像对称的,那么这颗树也是对称的。
问题转换为:两个子树在什么情况下对称
1.跟节点具有相同的值
2.每个树的右子树与另一个数的左子树对称

class Solution(object):def isSymmetric(self, root):""":type root: TreeNode:rtype: bool"""def ismirror_bottom_up(node1,node2):if node1==None and node2==None:return Trueif node1==None or node2==None:return Falsereturn node1.val==node2.val and ismirror_bottom_up(node1.left,node2.right) and ismirror_bottom_up(node1.right,node2.left)flag=ismirror_bottom_up(root,root) # root 和root为镜像,root自己本身为镜像return flag

迭代的解法:队列初始化为[root,root],将需要比较的点放在相邻位置。每次弹出两个节点,如果两个节点相同时,node1.left 和node2.right 放入队列;将node1.right与node2.left放入队列。这样押入弹出直至对比完该对比的节点。

class Solution(object):def isSymmetric(self, root):""":type root: TreeNode:rtype: bool"""que=[root,root]while(que):node1=que.pop(0)node2=que.pop(0)if node1==None and node2==None:continueif node1==None or node2==None:return Falseif node1.val!=node2.val:return Falseque.append(node1.left)que.append(node2.right)que.append(node1.right)que.append(node2.left)return True

3.2路径总和

给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。

直觉上至顶向下,是可行的思路。在每个节点处将目标值-节点值,将这个差值传给下一个节点,不断重复,如果叶子节点处刚好减为0,说明存在一条路径使得该路径上所有节点的值相加等于目标和。递归函数应该返回True 或者False 程序实现上可以遍历所有的路径,将所有的结果取或,但是只有一个为True 其实递归就可以终止,这个该怎么写。

class Solution(object):def hasPathSum(self, root, sum):""":type root: TreeNode:type sum: int:rtype: bool"""def has_top_down(node,target):if node==None:return Falseif node.left==None and node.right==None:if target-node.val==0:return Trueif has_top_down(node.left,target-node.val):return Trueif has_top_down(node.right,target-node.val):return Truereturn Falsereturn has_top_down(root,sum)

维护一个堆栈,用于储存每一个节点和其需要匹配的信息。每次从堆栈中弹出一个节点,判断该节点是否为叶子节点,如果为叶子节点,则判断对应的目标值-节点值是否为0;如果该节点不为叶子节点,将其子节点和相应的信息押入堆栈中。–堆栈如此维护:深度优先遍历的结构,遍历完一条路径之后再去遍历其他的路径。第一条走过的是最右边的路径,是一个由右往左扫描的过程。

class Solution(object):def hasPathSum(self, root, sum):""":type root: TreeNode:type sum: int:rtype: bool"""if root==None:return Falsestack=[(root,sum)]while(stack):node,target=stack.pop()if node.left==None and node.right==None and node.val-target==0:return Trueif node.left:stack.append((node.left,target-node.val))if node.right:stack.append((node.right,target-node.val))return False

算法(15)-leetcode-explore-learn-数据结构-运用递归解决二叉树的问题相关推荐

  1. DSt:数据结构的最强学习路线之数据结构知识讲解与刷题平台、刷题集合、问题为导向的十大类刷题算法(数组和字符串、栈和队列、二叉树、堆实现、图、哈希表、排序和搜索、动态规划/回溯法/递归/贪心/分治)总

    DSt:数据结构的最强学习路线之数据结构知识讲解与刷题平台.刷题集合.问题为导向的十大类刷题算法(数组和字符串.栈和队列.二叉树.堆实现.图.哈希表.排序和搜索.动态规划/回溯法/递归/贪心/分治)总 ...

  2. leetcode旋转数组 c语言,leetcode explore 初级算法第三题,旋转数组代码实现

    leetcode explore 初级算法第三题,旋转数组代码实现.原题链接: 题目分析 因为题目不是很长,这里把题目贴出来: 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数. ...

  3. 有趣的数据结构算法12——利用递归解决八皇后问题

    有趣的数据结构算法12--利用递归解决八皇后问题 题目复述 解题思路 实现代码 GITHUB下载连接 本次教程主要讲述如何利用递归解决八皇后问题,它和汉诺塔一样让人很难过. 题目复述 据说西洋棋手都具 ...

  4. 前端必会算法——线性数据结构的递归遍历

    上一篇: 前端必会算法--线性数据结构的遍历 线性数据结构的递归遍历 数组是知道长度的,最好的遍历方式的循环 var arr = [1,2,3,4]; //循环遍历数组,常见,常用 function ...

  5. 算法工程师思维导图—数据结构与算法

    卖萌屋的妹子们(划掉)作者团整理的算法工程师思维导图,求职/自我提升/查漏补缺神器.该手册一共分为数据结构与算法.数学基础.统计机器学习和深度学习四个部分. 点击这里查看具体使用指南.该手册有两种获取 ...

  6. python 树状数组_【算法日积月累】19-高级数据结构:树状数组

    树状数组能解决的问题 树状数组,也称作"二叉索引树"(Binary Indexed Tree)或 Fenwick 树. 它可以高效地实现如下两个操作: 1.数组前缀和的查询: 2. ...

  7. 【数据结构与算法】如何高效学习数据结构与算法

    前言 本文是个人基于覃超老师的<算法训练营>的学习笔记,此笔记的内容都是学习后的个人记录.个人总结.理解和思想.仅供参考学习. 很多同学在大学的时候会觉得数据结构与算法很枯燥,很多小伙伴都 ...

  8. 算法设计与分析之循环与递归

    前言: 循环与递归可以说是算法设计中最基本但却也是最重要的工具方法.循环和递归对于学习过高级程序设计语言的人来说都并不陌生,但还是有必要仔细的探究一下循环和递归之间的相似和区别.循环与递归最大的相似之 ...

  9. 第02期 基础算法(Leetcode)刻意练习开营计划

    背景 如果说 Java 是自动档轿车,C 就是手动档吉普.数据结构与算法呢?是变速箱的工作原理.你完全可以不知道变速箱怎样工作,就把自动档的车子从 A 开到 B,而且未必就比懂得的人慢.写程序这件事, ...

最新文章

  1. 送给那些还在迷茫的人
  2. 十九种损失函数,你能认识几个?
  3. OpenStack 关于admin-openrc.sh的作用(Queens版本)
  4. 循环截取字符串添加换行
  5. sqlserver 2008 R2 删除重复数据
  6. apache/nginx/tomcat的区别
  7. python冒泡排序实验报告_python中的冒泡排序
  8. 特斯拉首个中国工厂落户上海临港
  9. [转载] Python判断分数等级if...elif...else
  10. 晶振 Crystal
  11. python猜数字十次、猜对输出猜了多少次_python-猜数字小练习
  12. 1102: 【入门】字符图形1-星号矩形
  13. Office产品 “您的组织策略阻止我们为您完成此操作” 解决办法
  14. 计算机中图分类法,计算机中图分类号.doc
  15. 固定资产拆分比例怎么计算_固定资产折旧的计算方法
  16. 将光标从下划线变成竖线的方法
  17. 异贝,通过移动互联网技术,为中小微实体企业联盟、线上链接、线上线下自定义营销方案推送。案例55
  18. PM,RD,FE,UE,UI,QA等开发常见部门简称
  19. 算法复杂度 hdu1425
  20. npm install 报错 - node篇

热门文章

  1. 嵌入式Linux操作系统的版本查询
  2. 修改了WINCE自带的驱动程序后如何编译
  3. css 商城 两列_【云控基础】HTML+CSS基础入门
  4. rabbitmq 消费端代码获取队列名称_C#调用RabbitMQ实现消息队列的示例代码
  5. python向量化和c哪个快_在python中向量化6 for循环累积和
  6. python教程闭包_Python教程 闭包的特性
  7. 【转】SharePoint 术语表
  8. node工程默认url_node命令行工具之实现项目工程自动初始化的标准流程
  9. 工作篇-佛山三水恒大-2020.10.23
  10. 【LeetCode 986】 区间列表的交集(区间交集)