用C语言编程实现二叉树中序遍历和后续遍历的递归算法和非递归算法。
时间: 2024-05-10 19:14:37 浏览: 142
下面是C语言实现二叉树中序遍历和后序遍历的递归算法和非递归算法的代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAXSIZE 100
// 二叉树结构体
typedef struct TreeNode {
int data;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode, *PtrToNode;
// 栈结构体
typedef struct Stack {
PtrToNode data[MAXSIZE];
int top;
} Stack, *PtrToStack;
// 初始化栈
void InitStack(PtrToStack S) {
S->top = -1;
}
// 判断栈是否为空
bool IsEmpty(PtrToStack S) {
return S->top == -1;
}
// 判断栈是否已满
bool IsFull(PtrToStack S) {
return S->top == MAXSIZE - 1;
}
// 入栈
void Push(PtrToStack S, PtrToNode X) {
if (IsFull(S)) {
printf("栈已满\n");
return;
}
S->data[++S->top] = X;
}
// 出栈
PtrToNode Pop(PtrToStack S) {
if (IsEmpty(S)) {
printf("栈已空\n");
return NULL;
}
return S->data[S->top--];
}
// 中序遍历递归算法
void InOrderTraversal(PtrToNode root) {
if (root) {
InOrderTraversal(root->left);
printf("%d ", root->data);
InOrderTraversal(root->right);
}
}
// 中序遍历非递归算法
void InOrderTraversal2(PtrToNode root) {
Stack S;
InitStack(&S);
PtrToNode p = root;
while (p || !IsEmpty(&S)) {
if (p) {
Push(&S, p);
p = p->left;
} else {
p = Pop(&S);
printf("%d ", p->data);
p = p->right;
}
}
}
// 后序遍历递归算法
void PostOrderTraversal(PtrToNode root) {
if (root) {
PostOrderTraversal(root->left);
PostOrderTraversal(root->right);
printf("%d ", root->data);
}
}
// 后序遍历非递归算法
void PostOrderTraversal2(PtrToNode root) {
Stack S;
InitStack(&S);
PtrToNode p = root;
PtrToNode r = NULL;
while (p || !IsEmpty(&S)) {
if (p) {
Push(&S, p);
p = p->left;
} else {
p = S.data[S.top];
if (p->right && p->right != r) {
p = p->right;
Push(&S, p);
p = p->left;
} else {
p = Pop(&S);
printf("%d ", p->data);
r = p;
p = NULL;
}
}
}
}
// 创建二叉树
void CreateTree(PtrToNode *root) {
int data;
scanf("%d", &data);
if (data == -1) {
*root = NULL;
} else {
*root = (PtrToNode)malloc(sizeof(TreeNode));
(*root)->data = data;
CreateTree(&((*root)->left));
CreateTree(&((*root)->right));
}
}
int main() {
PtrToNode root;
printf("请输入二叉树的前序遍历序列,-1表示空节点:\n");
CreateTree(&root);
printf("中序遍历递归算法:");
InOrderTraversal(root);
printf("\n中序遍历非递归算法:");
InOrderTraversal2(root);
printf("\n后序遍历递归算法:");
PostOrderTraversal(root);
printf("\n后序遍历非递归算法:");
PostOrderTraversal2(root);
printf("\n");
return 0;
}
```
其中,CreateTree函数用于创建二叉树,InOrderTraversal和PostOrderTraversal函数分别是中序遍历和后序遍历的递归算法,InOrderTraversal2和PostOrderTraversal2函数分别是中序遍历和后序遍历的非递归算法。在非递归算法中,我们使用了栈来模拟递归的过程。
阅读全文