6.2 数据结构---树(路径)

一、路径

1.二叉树的所有路径 leetcode 257

思路:深度遍历

  

2.求根到叶子节点数字之和 leetcode 129

 

 

 

 

思路:深度遍历,递归保存每一条路径

这里用int(s)就可以将以0开头的字符串'00123...'转成数字,或者将很多0组成的‘000...’转成0

‘001’--> int('001')=1

'000'-->int('000')=0

  

二、路径总和

1.路径总和  leetcode112

给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。
 
说明: 叶子节点是指没有子节点的节点。
 
示例:
给定如下二叉树,以及目标和 sum = 22
 
              5
             / \
            4   8
           /   / \
          11  13  4
         /  \      \
        7    2      1
返回 true, 因为存在目标和为 22 的根节点到叶子节点的路径 5->4->11->2

  

思路: 用栈将递归转成迭代的形式。深度优先搜索在除了最坏情况下都比广度优先搜索更快。 最坏情况是指满足目标和的 root->leaf 路径是最后被考虑的,这种情况下深度优先搜索和广度优先搜索代价是相通的。 利用深度优先策略访问每个节点,同时更新剩余的目标和。 所以我们从包含根节点的栈开始模拟,剩余目标和为 sum - root.val。 然后开始迭代:弹出当前元素,如果当前剩余目标和为 0 并且在叶子节点上返回 True; 如果剩余和不为零并且还处在非叶子节点上,将当前节点的所有孩子以及对应的剩余和压入栈中。

时间复杂度:和递归方法相同是O(N)。 空间复杂度:当树不平衡的最坏情况下是O(N) 。在最好情况(树是平衡的)下是 O(log N)。 

2.路径总和|  leetcode113

给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。
 
说明: 叶子节点是指没有子节点的节点。
 
示例:
给定如下二叉树,以及目标和 sum = 22
 
              5
             / \
            4   8
           /   / \
          11  13  4
         /  \    / \
        7    2  5   1
返回:
 
[
   [5,4,11,2],
   [5,8,4,5]
]

思路:

  1. 从根节点深度遍历二叉树,先序遍历时,将该节点值存储值path栈中,使用path_value累加节点值;
  2. 当遍历至叶节点时,检查path_value值是否为sum,若为sum,则将path push进入result中;
  3. 在后续遍历时,将该节点值从path栈中弹出,path_value减去节点值。

代码1:用栈

代码2:

 

3.路径总和||  leetcode437

给定一个二叉树,它的每个结点都存放着一个整数值。
 
找出路径和等于给定数值的路径总数。
 
路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。
 
二叉树不超过1000个节点,且节点数值范围是 [-1000000,1000000] 的整数。
 
示例:
 
root = [10,5,-3,3,2,null,11,3,-2,null,1], sum = 8
 
      10
     /  \
    5   -3
   / \    \
  3   2   11
 / \   \
3  -2   1
 
返回 3。和等于 8 的路径有:
 
1.  5 -> 3
2.  5 -> 2 -> 1
3.  -3 -> 11

三、最大路径和

1.最大路径和 leetcode124

题目:给定一棵二叉树,求各个路径的最大和,路径可以以任意节点作为起点和终点。

思路:后序遍历,每次递归的时候只返回左子树/右子树+root.data,最大值是全局记录的,所以不需要返回

最大路径和:根据当前节点的角色,路径和可分为两种情况:
一:以当前节点为根节点
1.只有当前节点
2.当前节点+左子树🌲
3.当前节点+右子树🌲
4.当前节点+左右子树 
这四种情况的最大值即为以当前节点为根的最大路径和
此最大值要和已经保存的最大值比较,得到整个树的最大路径值

二:当前节点作为父节点的一个子节点
和父节点连接的话则需取【单端的最大值】
1.只有当前节点
2.当前节点+左子树🌲
3.当前节点+右子树🌲
这三种情况的最大值

  

四、最长同值路径 

1.最长同值路径 leetcode687

给定一个二叉树,找到最长的路径,这个路径中的每个节点具有相同值。这条路径可以经过也可以不经过根节点。
注意:两个节点之间的路径长度由它们之间的边数表示。
 
示例1:
输入:
              5
             / \
            4   5
           / \   \
          1   1   5
输出:2
 
示例 2:
输入:
              1
             / \
            4   5
           / \   \
          4   4   5
输出:2
注意: 给定的二叉树不超过10000个结点.树的高度不超过1000。 

思路:先解释一下题目,就是让我们找到一个路径,这个路径上面的值都相同,而且可以不经过根节点,例如,例2中的4-4-4这样的。 可以使用递归来做,首先,求出以每个节点为根节点的最长路径,然后从底向上,判断与父亲节点的值是否相同,如果相同,就把当前结点最长的一个分支路径加上1返回给父节点。其中,可以把最长路径保存到一个全局变量中。

 

五、公共祖先

1.找出排序二叉树上任意两个节点的公共父节点

思考

  1. 两个节点的公共祖先一定在从根节点,至这两个节点的路径上;
  2. 由于求公共祖先中的最近公共祖先,那么即同时出现在这两条路径上的离根节点最远的节点(或离两个最近);
  3. 最终算法即:求p节点路径,q节点路径,两路径上最后一个相同的节点。

思路:先序遍历

  1. 从根节点遍历(搜索)至该节点,找到该节点后就结束搜索;
  2. 将遍历过程中遇到的节点按照顺序存储起来,这些节点即路径节点。
  3. 求出较短路径的长度n;
  4. 同时遍历p节点的路径和q节点的路径,遍历n个节点,最后一个发现的相同节点,即最近公共祖先

  

 

posted @   nxf_rabbit75  阅读(2463)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
一、路径1.二叉树的所有路径 leetcode 2572.求根到叶子节点数字之和 leetcode 129二、路径总和1.路径总和  leetcode1122.路径总和|  leetcode1133.路径总和||  leetcode437三、最大路径和1.最大路径和 leetcode124四、最长同值路径 1.最长同值路径 leetcode687五、公共祖先1.找出排序二叉树上任意两个节点的公共父节点
点击右上角即可分享
微信分享提示