非递归遍历二叉树c++
时间: 2024-05-10 12:13:24 浏览: 10
非递归遍历二叉树是指在不使用递归函数的情况下,对二叉树进行遍历的方法。以下是三种非递归遍历二叉树的方法:
1. 非递归中序遍历二叉树
中序遍历二叉树的顺序是:左子树 -> 根节点 -> 右子树。使用栈来保存未被访问的节点,具体步骤如下:
1)从根节点开始,将当前节点入栈。
2)如果当前节点有左子树,则将左子树入栈并进入左子树,重复步骤2,直到左子树为空。
3)从栈中弹出节点,访问该节点。
4)如果该节点有右子树,则将右子树入栈并进入右子树,重复步骤2、3、4。
2. 非递归先序遍历二叉树
先序遍历二叉树的顺序是:根节点 -> 左子树 -> 右子树。使用栈来保存未被访问的节点,具体步骤如下:
1)从根节点开始,将当前节点入栈。
2)从栈中弹出节点,访问该节点。
3)如果该节点有右子树,则将右子树入栈。
4)如果该节点有左子树,则将左子树入栈。
5)重复步骤2、3、4,直到栈为空。
3. 非递归后序遍历二叉树
后序遍历二叉树的顺序是:左子树 -> 右子树 -> 根节点。使用两个栈来实现,具体步骤如下:
1)将根节点入栈1。
2)从栈1中弹出节点,并将该节点入栈2。
3)如果该节点有左子树,则将左子树入栈1。
4)如果该节点有右子树,则将右子树入栈1。
5)重复步骤2、3、4,直到栈1为空。
6)从栈2中依次弹出节点并访问。
相关问题
中序非递归遍历二叉树C++
以下是C++中实现二叉树的中序非递归遍历的代码:
```cpp
#include <iostream>
#include <stack>
using namespace std;
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
void inorderTraversal(TreeNode* root) {
stack<TreeNode*> s;
TreeNode* cur = root;
while (cur != NULL || !s.empty()) {
while (cur != NULL) {
s.push(cur);
cur = cur->left;
}
cur = s.top();
s.pop();
cout << cur->val << " ";
cur = cur->right;
}
}
int main() {
TreeNode* root = new TreeNode(1);
root->right = new TreeNode(2);
root->right->left = new TreeNode(3);
inorderTraversal(root); // 输出:1 3 2
return 0;
}
```
C++使用递归和非递归遍历二叉树
遍历二叉树有三种方式,分别是前序遍历、中序遍历和后序遍历。其中,前序遍历指先遍历根节点,再遍历左子树和右子树;中序遍历指先遍历左子树,再遍历根节点和右子树;后序遍历指先遍历左子树和右子树,再遍历根节点。下面是使用递归和非递归方式遍历二叉树的示例代码:
```c++
#include <iostream>
#include <stack>
using namespace std;
// 二叉树结点的定义
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
// 递归前序遍历
void preorderTraversalRecursive(TreeNode* root) {
if (root == NULL) return;
cout << root->val << " ";
preorderTraversalRecursive(root->left);
preorderTraversalRecursive(root->right);
}
// 非递归前序遍历
void preorderTraversalIterative(TreeNode* root) {
if (root == NULL) return;
stack<TreeNode*> s;
s.push(root);
while (!s.empty()) {
TreeNode* node = s.top();
s.pop();
cout << node->val << " ";
if (node->right != NULL) s.push(node->right);
if (node->left != NULL) s.push(node->left);
}
}
// 递归中序遍历
void inorderTraversalRecursive(TreeNode* root) {
if (root == NULL) return;
inorderTraversalRecursive(root->left);
cout << root->val << " ";
inorderTraversalRecursive(root->right);
}
// 非递归中序遍历
void inorderTraversalIterative(TreeNode* root) {
if (root == NULL) return;
stack<TreeNode*> s;
TreeNode* node = root;
while (node != NULL || !s.empty()) {
while (node != NULL) {
s.push(node);
node = node->left;
}
node = s.top();
s.pop();
cout << node->val << " ";
node = node->right;
}
}
// 递归后序遍历
void postorderTraversalRecursive(TreeNode* root) {
if (root == NULL) return;
postorderTraversalRecursive(root->left);
postorderTraversalRecursive(root->right);
cout << root->val << " ";
}
// 非递归后序遍历
void postorderTraversalIterative(TreeNode* root) {
if (root == NULL) return;
stack<TreeNode*> s1, s2;
s1.push(root);
while (!s1.empty()) {
TreeNode* node = s1.top();
s1.pop();
s2.push(node);
if (node->left != NULL) s1.push(node->left);
if (node->right != NULL) s1.push(node->right);
}
while (!s2.empty()) {
cout << s2.top()->val << " ";
s2.pop();
}
}
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);
root->right->left = new TreeNode(6);
root->right->right = new TreeNode(7);
// 递归遍历
cout << "递归前序遍历:";
preorderTraversalRecursive(root);
cout << endl;
cout << "递归中序遍历:";
inorderTraversalRecursive(root);
cout << endl;
cout << "递归后序遍历:";
postorderTraversalRecursive(root);
cout << endl;
// 非递归遍历
cout << "非递归前序遍历:";
preorderTraversalIterative(root);
cout << endl;
cout << "非递归中序遍历:";
inorderTraversalIterative(root);
cout << endl;
cout << "非递归后序遍历:";
postorderTraversalIterative(root);
cout << endl;
return 0;
}
```
注意,非递归方式需要使用栈来存储待遍历的结点,同时也需要注意遍历顺序。