用c语言,带注释和输入说明 实验题目: 二叉树后序遍历的非递归算法。 实验说明:二叉树后序遍历的非递归算法:结点要入两次栈,出两次栈;为了区别同一个结点的两次出栈,设置标志flag,当结点进、出栈时,其标志flag也同时进、出栈。 设根指针为root,则可能有以下两种情况: ⑴ 若root!=NULL,则root及标志flag(置为1)入栈,遍历其左子树; ⑵ 若root=NULL,此时若栈空,则整个遍历结束;若栈不空,则表明栈顶结点的左子树或右子树已遍历完毕。若栈顶结点的标志flag=1,则表明栈顶结点的左子树已遍历完毕,将flag修改为2,并遍历栈顶结点的右子树;若栈顶结点的标志flag=2,则表明栈顶结点的右子树也遍历完毕,输出栈顶结点。
时间: 2024-02-22 12:55:29 浏览: 84
好的,下面是带有注释和输入说明的 C 语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_STACK_SIZE 100
// 定义二叉树结点的结构体
typedef struct TreeNode {
int data;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
// 定义栈结构体
typedef struct Stack {
TreeNode *data[MAX_STACK_SIZE];
int top;
} Stack;
// 初始化栈
void initStack(Stack *s) {
s->top = -1;
}
// 判断栈是否为空
int isEmpty(Stack *s) {
return s->top == -1;
}
// 判断栈是否已满
int isFull(Stack *s) {
return s->top == MAX_STACK_SIZE - 1;
}
// 入栈操作
void push(Stack *s, TreeNode *node) {
if (isFull(s)) {
printf("Error: stack is full!\n");
return;
}
s->data[++s->top] = node;
}
// 出栈操作
TreeNode *pop(Stack *s) {
if (isEmpty(s)) {
printf("Error: stack is empty!\n");
return NULL;
}
return s->data[s->top--];
}
// 获取栈顶元素
TreeNode *peek(Stack *s) {
if (isEmpty(s)) {
printf("Error: stack is empty!\n");
return NULL;
}
return s->data[s->top];
}
// 后序遍历二叉树(非递归算法)
void postOrder(TreeNode *root) {
if (root == NULL) {
printf("Error: root is null!\n");
return;
}
Stack s;
initStack(&s);
TreeNode *current = root, *lastVisited = NULL;
int flag;
while (current != NULL || !isEmpty(&s)) {
while (current != NULL) {
push(&s, current);
flag = 1;
current = current->left;
}
current = peek(&s);
if (current->right == NULL || current->right == lastVisited) {
pop(&s);
printf("%d ", current->data);
lastVisited = current;
current = NULL;
} else {
flag = 2;
current = current->right;
}
if (!isEmpty(&s) && peek(&s)->data == lastVisited->data) {
pop(&s);
printf("%d ", lastVisited->data);
lastVisited = peek(&s);
flag = 2;
current = NULL;
}
}
}
int main() {
// 构造二叉树
TreeNode *root = (TreeNode *) malloc(sizeof(TreeNode));
root->data = 1;
TreeNode *left = (TreeNode *) malloc(sizeof(TreeNode));
left->data = 2;
TreeNode *right = (TreeNode *) malloc(sizeof(TreeNode));
right->data = 3;
TreeNode *leftRight = (TreeNode *) malloc(sizeof(TreeNode));
leftRight->data = 4;
TreeNode *rightLeft = (TreeNode *) malloc(sizeof(TreeNode));
rightLeft->data = 5;
root->left = left;
root->right = right;
left->left = NULL;
left->right = leftRight;
right->left = rightLeft;
right->right = NULL;
leftRight->left = NULL;
leftRight->right = NULL;
rightLeft->left = NULL;
rightLeft->right = NULL;
// 后序遍历二叉树
printf("Post-order traversal: ");
postOrder(root);
printf("\n");
return 0;
}
```
输入说明:
本程序中的二叉树是手动构造的,在 `main()` 函数中构造了一个如下图所示的二叉树:
```
1
/ \
2 3
/
5
/
4
```
注释说明:
在代码中,我添加了详细的注释,来解释每一行代码的作用,以方便您理解程序的实现原理。
阅读全文
相关推荐
![-](https://img-home.csdnimg.cn/images/20241231044955.png)
![-](https://img-home.csdnimg.cn/images/20241231044901.png)
![-](https://img-home.csdnimg.cn/images/20241231045053.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![docx](https://img-home.csdnimg.cn/images/20241231044901.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![-](https://img-home.csdnimg.cn/images/20241231045053.png)
![-](https://img-home.csdnimg.cn/images/20241231044955.png)
![-](https://img-home.csdnimg.cn/images/20241231044955.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![-](https://img-home.csdnimg.cn/images/20241231044955.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)