通缉:有序二叉树输出法的递归公式

Posted

技术标签:

【中文标题】通缉:有序二叉树输出法的递归公式【英文标题】:Wanted: Recurrence Formula of In-Order binary tree output method 【发布时间】:2012-07-08 10:48:18 【问题描述】:

我在寻找这个 java 方法的递归公式时有点卡住了

void printInorder(Node<T> v) 
    if(v != null) 
        printInorder(v.getLeft());
        System.out.println(v.getData());
        printInorder(v.getRight());
    

一些标准:

它是一棵完全二叉树(每个内结有 2 个孩子,每个叶子的深度相同) 这棵树有 n 个结点,复杂度为 O(n)

我必须找到与n knots 的树的depth h 相关的递归公式,作为额外的奖励,我需要从中推断出导致 O(n) 的显式公式。

现在,这就是我得到的:

d = depth of the tree
c = constant runtime for execution of the method itself
d = 1: T(n) = c
d = 3: T(n) = T(d=1) + T(d=2) + T(d=3) + c

我使用示例 d = 3 来为自己澄清事情,我很难进一步分解它。我的假设是否正确?


编辑: 下一次尝试

[x] =  x in real numbers : max([x]) <= x , [x] rounded down to next full number
d = 1: T(d) = 1
d > 1: T(d) = 2^(h-1) * T(n/(2^(h-1)))

1: T(h)  = T(i = 0) + T(i = 1) + ... T(i = h-1)
2: T(h) <= (2^(0-1) + n/(2^(0-1))) + (2^(1-1) + n/(2^(1-1))) + ... + (2^(h-2) + n/(2^(h-2)))
3: T(h)  = n + n + ... + n
4: T(h)  = (h-1)n
5: T(h)  = O(n)

因为树的每一层深度正好包含 2^(h-1) 个节点,所以第 4 行中的 h 因子可​​以忽略,因为 n 与最终结果更相关。

【问题讨论】:

【参考方案1】:

T(n) = T(n/2) + T(n/2) + 1

0 级有 1 个操作。

1 级有 2 个操作。

2 级有 4 个操作。

k 级有 2^k 次操作。

树的深度是lgn。

1+2+...+2^lgn= 2^0+2^1+2^2+...+2^lgn= (2^(lgn + 1)-1)/(2-1)=2*2^lgn= 2n.

【讨论】:

【参考方案2】:

这是一种使用平滑规则的替代方法(Levitin,算法的设计与分析,第 2 版,481-82),它允许将这样的递归关系表示为而是指数。

任何一种方法——前向或后向替换——都适用于这个问题。我发现在很多情况下向后替换更容易理解。

【讨论】:

以上是关于通缉:有序二叉树输出法的递归公式的主要内容,如果未能解决你的问题,请参考以下文章

二叉树算法总结

二叉树遍历

第三节.二叉树和分治法

C语言,如何用非递归方法输出二叉树的根到所有叶子路径?

二叉树与二叉搜索树

创建二叉树非递归完成对二叉树的先序和后序遍历并遍历输出每一层的结点数查找结点P 和结点Q的最近共同祖先