用C++编写程序,实现二叉树的先序、中序和后序的非递归算法
时间: 2024-05-11 19:16:13 浏览: 101
C++二叉树的前序,中序,后序,层序遍历的递归算法55555.docx
好的,我可以为您解答这个问题。以下是实现二叉树的先序、中序和后序的非递归算法的 C 代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
typedef struct node {
char data;
struct node *left;
struct node *right;
} Node;
typedef struct stack {
Node* array[MAXSIZE];
int top;
} Stack;
Stack* createStack() {
Stack* s = (Stack*)malloc(sizeof(Stack));
s->top = -1;
return s;
}
void push(Stack* s, Node* item) {
if (s->top == MAXSIZE - 1) {
printf("Stack full!\n");
return;
}
s->top++;
s->array[s->top] = item;
}
Node* pop(Stack* s) {
if (s->top == -1) {
printf("Stack empty!\n");
return NULL;
}
Node* popped = s->array[s->top];
s->top--;
return popped;
}
int isEmpty(Stack* s) {
return s->top == -1;
}
void iterativePreorder(Node* root) {
if (root == NULL)
return;
Stack* s = createStack();
push(s, root);
while (!isEmpty(s)) {
Node* curr = pop(s);
printf("%c ", curr->data);
if (curr->right)
push(s, curr->right);
if (curr->left)
push(s, curr->left);
}
}
void iterativeInorder(Node* root) {
if (root == NULL)
return;
Stack* s = createStack();
Node* curr = root;
while (curr != NULL || !isEmpty(s)) {
while (curr != NULL) {
push(s, curr);
curr = curr->left;
}
curr = pop(s);
printf("%c ", curr->data);
curr = curr->right;
}
}
void iterativePostorder(Node* root) {
if (root == NULL)
return;
Stack* s1 = createStack();
Stack* s2 = createStack();
push(s1, root);
while (!isEmpty(s1)) {
Node* curr = pop(s1);
push(s2, curr);
if (curr->left)
push(s1, curr->left);
if (curr->right)
push(s1, curr->right);
}
while (!isEmpty(s2)) {
Node* curr = pop(s2);
printf("%c ", curr->data);
}
}
Node* newNode(char data) {
Node* node = (Node*)malloc(sizeof(Node));
node->data = data;
node->left = NULL;
node->right = NULL;
return node;
}
int main() {
Node* root = newNode('A');
root->left = newNode('B');
root->right = newNode('C');
root->left->left = newNode('D');
root->left->right = newNode('E');
root->right->left = newNode('F');
root->right->right = newNode('G');
printf("Iterative Preorder Traversal: ");
iterativePreorder(root);
printf("\n");
printf("Iterative Inorder Traversal: ");
iterativeInorder(root);
printf("\n");
printf("Iterative Postorder Traversal: ");
iterativePostorder(root);
printf("\n");
return 0;
}
```
在这个代码中,我们定义了 `Node` 结构体来表示二叉树中的节点,每个节点有一个字符数据、一个指向左子树的指针和一个指向右子树的指针。我们还定义了 `Stack` 结构体来表示堆栈,堆栈包含一个数组和一个指向堆栈顶部的指针。`createStack` 函数用于创建一个新的堆栈,`push` 函数用于将一个节点推入堆栈,`pop` 函数用于从堆栈中弹出一个节点,`isEmpty` 函数用于检查堆栈是否为空。
实现先序遍历的非递归算法我们使用一个堆栈,先将根节点压入栈中,然后进入循环,每次从堆栈中弹出一个节点,输出该节点的数据,并将其右子节点和左子节点按照相反的顺序压入堆栈中。这样在下一次循环中,会先遍历左子树,再遍历右子树。
实现中序遍历的非递归算法也使用一个堆栈,首先从当前节点开始,依次将其所有左子节点压入堆栈中,然后弹出堆栈中的最后一个节点 `curr`,输出该节点的数据并将其右子节点作为当前节点。不断重复以上步骤,直到当前节点为空并且堆栈为空。
实现后序遍历的非递归算法我们使用两个堆栈,先将根节点压入第一个堆栈中,然后进入循环,每次从第一个堆栈中弹出一个节点 `curr`,然后将该节点按照根右左的顺序压入第二个堆栈中,先右后左是为了保证后序遍历的逆序。重复以上步骤,直到第一个堆栈为空。最后再依次从第二个堆栈中弹出节点并输出。
在 `main` 函数中我们创建了一个简单的二叉树并对其进行了先序、中序和后序的非递归遍历,输出结果如下:
```
Iterative Preorder Traversal: A B D E C F G
Iterative Inorder Traversal: D B E A F C G
Iterative Postorder Traversal: D E B F G C A
```
阅读全文