我一直在思考使用栈进行二叉树迭代前序遍历的空间复杂度是多少。
我参考了《编程面试要点》(Elements of Programming Interviews)这本书,他们指出:
空间复杂度为O(h),其中h是树的高度,因为除了栈顶节点之外,栈中的节点对应于从根开始的路径上的节点的右子节点。
以下是参考代码:
struct Node{
int data;
struct Node* left, right;
}
void printPreOrder(struct Node* root){
if(!root)
return ;
stack<struct Node* > s;
s.push(root);
while(!s.empty()){
struct Node *root_element = s.top();
cout<<root_element->data<<" ";
s.pop();
if(root_element->right){
s.push(root_element->right);
}
if(root_element->left){
s.push(root_element->left);
}
}
cout<<endl;
}
return ;
}
我的直觉
在研究算法时,我发现堆栈在任何时刻的最大条目数可以是max(num_of_leaves_in_left_subtree+1, num_of_trees_in_right_subtree)。由此我们可以推断出,对于高度为h的树,叶子节点的最大数量可以是2^h。因此,左子树中最多的树的数量将是2^(h-1)。因此,堆栈中的最大条目数将是2^(h-1)+1。因此,根据我的理解,上述算法的空间复杂度将是O(2^(log(n)))。