假设树采用指针方式的孩子表示法表示,试编写一个非递归函数void preorder1(tree root),实现树的前序遍历算法。
时间: 2023-05-03 13:02:34 浏览: 139
先序遍历的非递归算法
5星 · 资源好评率100%
假设树的节点表示为Node类型,包含左右子节点和数据域。则以先序遍历方式遍历一棵树的非递归函数的实现,可以参考以下代码:
void preorder1(Node* root){
stack<Node*> s;
s.push(root);
while(!s.empty()){
Node* curr = s.top();
s.pop();
if(curr){
//处理当前节点
cout << curr->data << " ";
//右子节点先入栈
s.push(curr->right);
//左子节点再入栈
s.push(curr->left);
}
}
}
在实现上,我们使用了一个栈来保存需要访问的节点。从根节点开始,每当访问一个节点时,就先打印其数据域,并将其右子节点和左子节点分别入栈,右子节点先入。这样可以保证后出栈的是左子节点。遍历完整棵树,即可实现先序遍历。
另外,需要注意的是,如果树中有空节点,则需要在遍历时做好空节点的判断和处理,以免程序崩溃。
阅读全文