c++先序遍历非递归算法
时间: 2023-12-03 16:01:09 浏览: 196
先序遍历是二叉树遍历的一种方法,其遍历顺序为根节点、左子树、右子树。非递归的先序遍历算法可以使用栈来实现。
具体算法如下:
1. 创建一个空栈和一个空的结果列表。
2. 将根节点压入栈中。
3. 当栈不为空时,执行以下操作:
4. 弹出栈顶元素,并将其值添加到结果列表中。
5. 如果弹出的节点存在右子树,将右子树的根节点压入栈中。
6. 如果弹出的节点存在左子树,将左子树的根节点压入栈中。
7. 返回结果列表。
非递归的先序遍历算法利用栈的特性,先将根节点压入栈中,然后在循环中不断取出栈顶元素,并将其值添加到结果列表中。同时,将该节点的右子树和左子树分别压入栈中。这样,在弹出栈顶节点的时候,下一次循环会先访问其左子树,从而实现了先序遍历的顺序。
使用非递归的先序遍历算法,可以遍历二叉树的每个节点,并按照先序的顺序输出节点的值。
相关问题
C++编写先序遍历的非递归算法
下面是C++编写的先序遍历非递归算法:
```c++
// Definition for a binary tree node.
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
vector<int> res;
stack<TreeNode*> s;
if (root != nullptr) {
s.push(root); // 将根节点入栈
}
while (!s.empty()) {
TreeNode* node = s.top();
s.pop(); // 弹出栈顶节点
res.push_back(node->val); // 将节点值加入到结果中
if (node->right != nullptr) {
s.push(node->right); // 右子树入栈
}
if (node->left != nullptr) {
s.push(node->left); // 左子树入栈
}
}
return res;
}
};
```
该算法利用了栈来模拟递归过程,先将根节点入栈,然后每次弹出栈顶节点,并将其值加入到结果中,接着将右子树和左子树依次入栈。
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;
}
```
我已经完成了你的要求,请问还有其他问题吗?
阅读全文