public void iterativePreorder(Node root) {
Stack nodes = new Stack();
nodes.push(root);
Node currentNode;
while (!nodes.isEmpty()) {
currentNode = nodes.pop();
Node right = currentNode.right();
if (right != null) {
nodes.push(right);
}
Node left = currentNode.left();
if (left != null) {
nodes.push(left);
}
System.out.println("Node data: "+currentNode.data);
}
}
来源:Wiki Tree Traversal
时间复杂度是O(n)吗?如果使用递归完成时间复杂度是否相同?
新问题: 如果我使用上面的代码从TreeA中找到某个节点来创建另一个树TreeB,它将拥有与TreeA一样多的节点,那么创建TreeB的复杂性将是O(n ^ 2),因为它是n个节点并且每个节点都会使用上面的代码,即O(n)?
答案 0 :(得分:18)
由于二叉树的遍历(与搜索和大多数其他树操作相反)需要处理所有树节点,因此任何遍历的最小复杂性算法是O(n),即线性wrt树中的节点数。这是一个不可改变的事实,除非有人建造量子计算机或其他东西,否则在一般情况下不会改变......
至于递归,唯一的区别是递归方法调用通过将调用帧推送到JVM堆栈来隐式构建堆栈,而示例代码显式构建堆栈。我宁愿不推测两者之间的任何性能差异 - 您应该为每个特定用例场景分析和基准两种备选方案。