没有递归的树遍历的空间复杂性

时间:2014-12-25 23:26:31

标签: algorithm complexity-theory space-complexity

此代码遍历树,但不使用递归,用堆栈替换它。 堆栈的最大大小应该是最后一级中的节点数。 以下代码的空间复杂度是:O(高度),其中根的高度是0?

public void preOrder() {
    if (root == null) throw new IllegalStateException("the root cannot be null");

    final Stack<TreeNode<E>> stack = new Stack<TreeNode<E>>();
    stack.add(root);

    while (!stack.isEmpty()) {
        final TreeNode<E> treeNode = stack.pop();
        System.out.print(treeNode.item + " "); 
        if (treeNode.right != null) stack.add(treeNode.right); 
        if (treeNode.left != null) stack.add(treeNode.left); 
    }
}

1 个答案:

答案 0 :(得分:4)

代码中唯一的空间使用来自Stack<>中的元素。因为,正如您在问题中所观察到的那样,Stack<>在任何时候的大小都是当前节点的深度(即距离根的距离),算法的空间复杂度为O(height)。例如,如果您有一个平衡的二叉树,O(height)可以低到O(log V),其中V是树中的顶点数。在最糟糕的情况下,O(height) = O(V)