递归树遍历算法的时间复杂度分析
Time Complexity Analysis of Recursive Tree Treversal Algorithm
我应该设计一个遍历树并为每个节点设置基数 属性 的递归算法。基数属性是当前遍历的节点为根的子树中的节点数
这是我的伪/python 代码算法:
SetCardinality(node)
if node exists:
node.card = 1 + SetCardinality(x.left_child) + SetCardinality(x.right_child)
return node.card
else:
return 0
我很难想出描述此函数的递归关系。我发现最坏情况下的输入是一棵高度为 n 的树。我在网上看到这个算法中这样一棵树的循环关系可能是:
T(n) = T(n-1) + n 但我不知道关系中的n如何对应算法。
你要问自己:算法访问了多少个节点?您会注意到,如果您 运行 在根节点上使用您的算法,它将恰好访问每个节点一次,这是预期的,因为它本质上是深度优先搜索。
因此,如果算法的其余部分是常量时间操作,则节点总数 的时间复杂度为 O(n) n.
现在,如果你想用树的高度来表达它,你需要更多地了解给定的树。如果它是一个完整的二叉树,那么高度是 O(logn) 因此时间复杂度将是 O(2h )。但用总节点数表示更简单。另请注意,树的形状对于您的时间复杂度并不重要,因为无论如何您都将访问每个节点一次。
我应该设计一个遍历树并为每个节点设置基数 属性 的递归算法。基数属性是当前遍历的节点为根的子树中的节点数
这是我的伪/python 代码算法:
SetCardinality(node)
if node exists:
node.card = 1 + SetCardinality(x.left_child) + SetCardinality(x.right_child)
return node.card
else:
return 0
我很难想出描述此函数的递归关系。我发现最坏情况下的输入是一棵高度为 n 的树。我在网上看到这个算法中这样一棵树的循环关系可能是: T(n) = T(n-1) + n 但我不知道关系中的n如何对应算法。
你要问自己:算法访问了多少个节点?您会注意到,如果您 运行 在根节点上使用您的算法,它将恰好访问每个节点一次,这是预期的,因为它本质上是深度优先搜索。
因此,如果算法的其余部分是常量时间操作,则节点总数 的时间复杂度为 O(n) n.
现在,如果你想用树的高度来表达它,你需要更多地了解给定的树。如果它是一个完整的二叉树,那么高度是 O(logn) 因此时间复杂度将是 O(2h )。但用总节点数表示更简单。另请注意,树的形状对于您的时间复杂度并不重要,因为无论如何您都将访问每个节点一次。