用C++编写一个程序,应用栈的知识,实现先序非递归
时间: 2024-10-25 21:06:39 浏览: 11
非线性数据结构的实现与应用(非递归).pdf
5星 · 资源好评率100%
在C++中,我们可以使用栈数据结构来实现二叉树的先序遍历(根节点 -> 左子树 -> 右子树),因为先序遍历的顺序正好符合栈的后进先出(LIFO)特性。这里是一个简单的示例,我们将使用迭代的方式来避免递归:
```cpp
#include <iostream>
#include <stack>
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
void preorderTraversal(TreeNode* root) {
if (root == nullptr) return;
std::stack<TreeNode*> stack; // 初始化一个空栈
stack.push(root); // 先入栈根节点
while (!stack.empty()) {
TreeNode* node = stack.top(); // 弹出栈顶元素
std::cout << node->val << " "; // 访问当前节点值
if (node->right != nullptr) stack.push(node->right); // 将右子节点压入栈
if (node->left != nullptr) stack.push(node->left); // 再将左子节点压入栈(保证先访问左)
}
}
int main() {
// 创建一个简单的二叉树用于测试
TreeNode* root = new TreeNode(1);
root->left = new TreeNode(2);
root->right = new TreeNode(3);
root->left->left = new TreeNode(4);
root->left->right = new TreeNode(5);
preorderTraversal(root); // 输出:1 2 4 5 3
return 0;
}
```
在这个例子中,我们创建了一个栈,并把根节点压入。然后进入一个循环,只要栈不为空,就不断从栈顶取出节点,访问它的值,再按照左->右的顺序将其子节点压入栈中,直到遍历完所有节点。
阅读全文