1080. 根到叶路径上的不足节点

Posted magic_zk

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1080. 根到叶路径上的不足节点相关的知识,希望对你有一定的参考价值。

题目描述

给了一个二叉树,给了不足节点的定义(所有经过该节点的从跟到叶子的路径和如果都小于limt)
需要删除所有的不足节点,返回最终的根节点

f1 分治+dfs

基本分析

  1. 从树上删除一个点,怎么操作方便?父节点删除比自己删除自己方便
  2. 以上信息给了什么启示?dfs中给父节点返回自己可以删除的信息,父节点去删除自己
  3. 如果某个节点的左右子节点都是不足节点,可以推出什么?这个节点也是不足节点(不重新计算路径值)
  4. 路径和怎么进行累加?定义s是从上往下传下去时候的路径和,最开始是0,每往下走,就会累加cur.val
  5. 为什么是后序遍历?拿到左右子节点的删除信息后,才能决定父节点是不是删除。

代码

class Solution:
    def sufficientSubset(self, root: Optional[TreeNode], limit: int) -> Optional[TreeNode]:
        def dfs(cur, s, k):
            if not cur.left and not cur.right:
                return s + cur.val < k
            
            del_l, del_r = True, True
            if cur.left:
                del_l = dfs(cur.left, s + cur.val, k)
            if cur.right:
                del_r = dfs(cur.right, s + cur.val, k)
            
            if del_l:
                cur.left = None
            if del_r:
                cur.right = None
            
            return del_l and del_r
        
        del_root = dfs(root, 0, limit)
        if del_root:
            return None
        else:
            return root

总结

  1. 怎么理解递归?将s值传递下去,再从底层的return结果判断父节点的情况。
  2. 为啥在dfs之前要把删除初值设置为True?如果没有某个子树,就没法通过dfs传参设置为True,最终没法返回真实的and的结果(True and True)

给定一棵二叉树,找到所有从根到叶的路径

【中文标题】给定一棵二叉树,找到所有从根到叶的路径【英文标题】:Given a binary tree find all root-to-leaf paths 【发布时间】:2016-08-20 03:50:24 【问题描述】:

给定一棵二叉树,问题是找到所有从根到叶的路径。我们通过以列表的形式传递路径并在遇到叶子时立即将其添加到结果中来了解算法。

我的问题存储所有路径消耗多少空间。我的直觉是,每条路径都会消耗树的高度(O(h))的内存顺序,如果我们的完整二叉树中有 2*n - 1 个节点,然后有 n 个叶子,每个叶子对应于一个路径所以空间复杂度将是 O(n*log(n)) 假设树是高度平衡的。我的分析正确吗?

【问题讨论】:

如果有 2^n -1 个节点,那么二叉树的高度是 log(2^n-1) 。总空间复杂度为 O(height * num of leaf nodes) = O(n*log(2^n-1)) ~ O(n^2) @SandeepReddyGoli:不,有 2n-1 个节点,而不是 2^n-1。如果确实有 2^n-1 个节点,则空间复杂度为 O(n 2^n),而不是 O(n²)。过度投票。 存储所有路径可以零成本完成,因为初始树已经包含它们并且可以在最佳时间 O(h) 内枚举任何路径。更好的是,在 O(n) 时间内枚举完整的路径集。 在任何一棵树中,总路径长度一般为n.h*,其中h*表示平均路径长度,不超过最大路径长度,设h°。在完全不平衡的树中,h* 和 h° 都是 O(n),而在平衡树中,它们都是 O(Log n)。 @Yvues 是的,我错了。感谢您指出。如果节点数为 2^n -1 ,则叶节点数约为 2^(n-1) ,则总计复杂度为 O(n*2^n) 【参考方案1】:

你的推理是正确的,但可以做得更准确。平衡二叉树不一定是full binary tree。


N(h)为高度为h时的路径数。那么N(h) &leq; 2 N(h - 1) 这是因为,给定一棵高度为 h 的树,每个子树的高度最多为 h - 1。所以

N(h) = O(2h).


现在我们需要绑定h。由于 h 出现在指数中,仅仅找到它的增长顺序是不够的。更准确地说,是known

n &geq; 2h - 1

所以

h &leq;日志(n + 1)

将其插入到我们之前的内容中

N(h) = O(2log(n + 1)) = O(n).


正如您所写,内存是路径上每个路径的节点的总和。每条路径上的节点总和最多为log(n + 1)。综合以上所有得到O(n log(n))

【讨论】:

以上是关于1080. 根到叶路径上的不足节点的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode No.129 求根节点到叶节点数字之和

数据结构与算法之深入解析“求根节点到叶节点数字之和”的求解思路与算法示例

打印所有根到叶路径

打印具有相对位置的所有根到叶路径

DFS | 从根到叶的二进制数之和附递归展开图

树1022. 从根到叶的二进制数之和