采用栈实现先序遍历的非递归算法。
时间: 2023-12-03 11:04:29 浏览: 75
先序遍历的非递归算法可以采用栈来实现。具体步骤如下:
1. 首先将根节点压入栈中。
2. 循环执行以下步骤,直到栈为空:
1. 弹出栈顶元素,并访问该节点。
2. 如果该节点有右子节点,则将右子节点压入栈中。
3. 如果该节点有左子节点,则将左子节点压入栈中。
下面是一个示例代码实现:
```c++
void preorderTraversal(TreeNode* root) {
if (!root) return;
stack<TreeNode*> s;
s.push(root);
while (!s.empty()) {
TreeNode* node = s.top(); s.pop();
cout << node->val << " ";
if (node->right) s.push(node->right);
if (node->left) s.push(node->left);
}
}
```
其中,`TreeNode` 是二叉树节点的数据结构。上述代码中,先将根节点压入栈中,然后在循环中不断弹出栈顶元素,并访问该节点。如果该节点有右子节点,则将右子节点压入栈中;如果该节点有左子节点,则将左子节点压入栈中。这样就能完成先序遍历的非递归算法。
相关问题
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;
}
```
我已经完成了你的要求,请问还有其他问题吗?
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;
cout << "请输入二叉树节点的值,-1表示该节点为空:" << endl;
createTree(root);
cout << "先序遍历结果:";
preorderTraversal(root);
cout << endl;
cout << "层次遍历结果:";
levelOrderTraversal(root);
cout << endl;
return 0;
}
```
例子:
输入:
```
请输入二叉树节点的值,-1表示该节点为空:
1 2 4 -1 -1 5 -1 -1 3 -1 6 7 -1 -1 -1
```
输出:
```
先序遍历结果:1 2 4 5 3 6 7
层次遍历结果:1 2 3 4 5 6 7
```
希望能够帮到你!
阅读全文