先序遍历的非递归算法c++
时间: 2023-12-03 10:03:44 浏览: 86
先序遍历的非递归算法可以使用栈来实现。具体步骤如下:
1. 创建一个栈,并将根节点入栈。
2. 当栈不为空时,执行以下操作:
a. 弹出栈顶节点,并访问该节点。
b. 如果该节点有右子节点,则将右子节点入栈。
c. 如果该节点有左子节点,则将左子节点入栈。
3. 重复步骤2直到栈为空。
下面是 C++代码实现:
```c++
void preorderTraversal(TreeNode* root) {
if (root == nullptr) return;
stack<TreeNode*> stk;
stk.push(root);
while (!stk.empty()) {
auto node = stk.top();
stk.pop();
cout << node->val << " ";
if (node->right) {
stk.push(node->right);
}
if (node->left) {
stk.push(node->left);
}
}
}
```
其中,`TreeNode` 表示二叉树的节点。你可以根据自己的需要进行更改。
相关问题
c++先序遍历非递归算法
先序遍历是二叉树遍历的一种方法,其遍历顺序为根节点、左子树、右子树。非递归的先序遍历算法可以使用栈来实现。
具体算法如下:
1. 创建一个空栈和一个空的结果列表。
2. 将根节点压入栈中。
3. 当栈不为空时,执行以下操作:
4. 弹出栈顶元素,并将其值添加到结果列表中。
5. 如果弹出的节点存在右子树,将右子树的根节点压入栈中。
6. 如果弹出的节点存在左子树,将左子树的根节点压入栈中。
7. 返回结果列表。
非递归的先序遍历算法利用栈的特性,先将根节点压入栈中,然后在循环中不断取出栈顶元素,并将其值添加到结果列表中。同时,将该节点的右子树和左子树分别压入栈中。这样,在弹出栈顶节点的时候,下一次循环会先访问其左子树,从而实现了先序遍历的顺序。
使用非递归的先序遍历算法,可以遍历二叉树的每个节点,并按照先序的顺序输出节点的值。
C++生成二叉树实现遍历,先序遍历采用递归算法,层次遍历采用非递归算法
好的,下面是C++生成二叉树实现遍历的代码,先序遍历采用递归算法,层次遍历采用非递归算法:
```c++
#include <iostream>
#include <queue>
using namespace std;
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
// 生成二叉树
void createTree(TreeNode*& root) {
int val;
cin >> val;
if (val == -1) {
root = NULL;
return;
}
root = new TreeNode(val);
createTree(root->left);
createTree(root->right);
}
// 先序遍历(递归)
void preorderTraversal(TreeNode* root) {
if (root == NULL) {
return;
}
cout << root->val << " ";
preorderTraversal(root->left);
preorderTraversal(root->right);
}
// 层次遍历(非递归)
void levelOrderTraversal(TreeNode* root) {
if (root == NULL) {
return;
}
queue<TreeNode*> q;
q.push(root);
while (!q.empty()) {
TreeNode* node = q.front();
q.pop();
cout << node->val << " ";
if (node->left) {
q.push(node->left);
}
if (node->right) {
q.push(node->right);
}
}
}
int main() {
TreeNode* root;
createTree(root);
cout << "先序遍历结果:";
preorderTraversal(root);
cout << endl;
cout << "层次遍历结果:";
levelOrderTraversal(root);
cout << endl;
return 0;
}
```
我已经完成了你的要求,请问还有其他问题吗?
阅读全文