[英]Recursive toString() method in a binary search tree. What is the time complexity for this?
我是Java的初学者,正在寻求帮助。
因此,我已经用Java制作了这个二叉树,并且我应该实现一种对所有元素进行排序并将它们转换为字符串的方法。 它应该看起来像前。 “ [1、2、3、4]”。 我使用StringBuilder来做到这一点。
我的方法代码看起来像这样:
/**
* Converts all nodes in current tree to a string. The string consists of
* all elements, in order.
* Complexity: ?
*
* @return string
*/
public String toString() {
StringBuilder string = new StringBuilder("[");
helpToString(root, string);
string.append("]");
return string.toString();
}
/**
* Recursive help method for toString.
*
* @param node
* @param string
*/
private void helpToString(Node<T> node, StringBuilder string) {
if (node == null)
return; // Tree is empty, so leave.
if (node.left != null) {
helpToString(node.left, string);
string.append(", ");
}
string.append(node.data);
if (node.right != null) {
string.append(", ");
helpToString(node.right, string);
}
}
所以我的问题是,我该如何计算时间复杂度? 另外,如果对如何改进此方法有任何建议,我将非常高兴。
最简单的答案是: O(n)
。 您访问每个节点一次并完成一(a)项工作。 计算会像
O(a*n)
并且因为我们忽略了恒定因素,所以简单的答案是
O(n)
但是 。 可能还会有人争辩,您所做的只是多一点:每次访问没有叶子的地方,您都返回null
。 这又是一项(b)要做的工作。
让我们暂时称呼那些看不见的叶子 。 按照这个想法,树中的每个值都是一个节点 ,该节点具有一个或两个不可见的叶子 。
因此,现在,我们要针对每个节点执行以下操作:
a | if a node has two child nodes
a + b | if a node has one child node
a + 2b | if a node has no child node.
对于最坏情况的二叉树(完全不平衡),我们有(n-1)个节点,其中有一个子节点和一个没有子节点的节点:
"1"
\
"2"
\
"3"
\
"4"
因此,计算是
(n-1)*(a+b) + b
<=> an + bn - a - b + b
<=> n(a+b) + b
=> O(an + bn) // we ignore `+ b` because we always look at really big n's
幸运的是,即使在最坏的情况下,复杂度仍然是线性的。 仅常数高于简单答案中的常数。 在大多数情况下-通常在需要Big-O比较算法时-我们甚至忽略了该因素,并且很高兴地说,算法的时间复杂度是线性的(O(n))。
由于您访问每个节点一次,因此时间复杂度为O(n)。 为了走这棵树,你别无其他。
时间复杂度在树中的节点数中呈线性关系:您正在访问每个节点一次。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.