二叉树中序遍历非递归c语言实现
时间: 2023-08-07 20:34:29 浏览: 120
二叉树的中序遍历非递归实现需要使用栈来实现,具体步骤如下:
1. 新建一个栈和一个指针变量p,初始时p指向根节点,栈为空。
2. 循环执行以下步骤,直到栈为空且p为空:
a. 如果p不为空,则将p入栈,并将p指向其左子节点。
b. 如果p为空,则将栈顶元素出栈并输出,然后将p指向栈顶元素的右子节点。
下面是该算法的C语言实现代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100
// 结点结构体
typedef struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
// 栈结构体
typedef struct Stack {
TreeNode *data[MAX_SIZE];
int top;
} Stack;
// 初始化栈
void initStack(Stack *stack) {
stack->top = -1;
}
// 判断栈是否为空
int isEmpty(Stack *stack) {
return stack->top == -1;
}
// 入栈
void push(Stack *stack, TreeNode *node) {
if (stack->top == MAX_SIZE - 1) {
printf("Stack overflow!\n");
exit(-1);
}
stack->data[++stack->top] = node;
}
// 出栈
TreeNode *pop(Stack *stack) {
if (isEmpty(stack)) {
printf("Stack is empty!\n");
exit(-1);
}
return stack->data[stack->top--];
}
// 二叉树的中序遍历非递归实现
void inorderTraversal(TreeNode *root) {
Stack stack;
initStack(&stack);
TreeNode *p = root;
while (!isEmpty(&stack) || p != NULL) {
if (p != NULL) {
push(&stack, p);
p = p->left;
} else {
TreeNode *node = pop(&stack);
printf("%d ", node->val);
p = node->right;
}
}
}
// 测试
int main() {
TreeNode *root = (TreeNode *)malloc(sizeof(TreeNode));
root->val = 1;
root->left = (TreeNode *)malloc(sizeof(TreeNode));
root->left->val = 2;
root->right = (TreeNode *)malloc(sizeof(TreeNode));
root->right->val = 3;
root->left->left = NULL;
root->left->right = (TreeNode *)malloc(sizeof(TreeNode));
root->left->right->val = 4;
root->left->right->left = (TreeNode *)malloc(sizeof(TreeNode));
root->left->right->left->val = 5;
root->left->right->left->left = NULL;
root->left->right->left->right = NULL;
root->left->right->right = NULL;
root->right->left = NULL;
root->right->right = (TreeNode *)malloc(sizeof(TreeNode));
root->right->right->val = 6;
root->right->right->left = NULL;
root->right->right->right = NULL;
inorderTraversal(root);
printf("\n");
return 0;
}
```
其中,TreeNode是结点的结构体,Stack是栈的结构体,MAX_SIZE是栈的容量。该算法的时间复杂度为O(n),空间复杂度为O(h),其中h为二叉树的高度。
阅读全文