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

Posted

技术标签:

【中文标题】给定一棵二叉树,找到所有从根到叶的路径【英文标题】: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) ≤ 2 N(h - 1) 这是因为,给定一棵高度为 h 的树,每个子树的高度最多为 h - 1。所以

N(h) = O(2h).


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

n ≥ 2h - 1

所以

h ≤日志(n + 1)

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

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


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

【讨论】:

以上是关于给定一棵二叉树,找到所有从根到叶的路径的主要内容,如果未能解决你的问题,请参考以下文章

112 Path Sum 路径总和

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

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

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

c_cpp 给定二叉树和求和,找到所有根到叶路径,其中每个路径的总和等于给定的总和

在树中找到最小值的路径