用c语言创建一棵二叉链表存储结构的二叉树; 利用先序遍历非递归算法遍历所建二叉树
时间: 2023-10-04 07:09:34 浏览: 123
以下是C语言创建二叉链表存储结构的二叉树,并使用先序遍历非递归算法进行遍历的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct TreeNode {
char data;
struct TreeNode* left;
struct TreeNode* right;
} TreeNode;
typedef struct Stack {
int top;
int size;
TreeNode** data;
} Stack;
// 初始化栈
Stack* init_stack(int size) {
Stack* s = (Stack*)malloc(sizeof(Stack));
s->size = size;
s->data = (TreeNode**)malloc(sizeof(TreeNode*) * size);
s->top = -1;
return s;
}
// 入栈
void push(Stack* s, TreeNode* node) {
if (s->top == s->size - 1) {
return;
}
s->data[++s->top] = node;
}
// 出栈
TreeNode* pop(Stack* s) {
if (s->top == -1) {
return NULL;
}
return s->data[s->top--];
}
// 创建二叉树
TreeNode* create_tree() {
char ch;
scanf("%c", &ch);
if (ch == '#') {
return NULL;
}
TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode));
root->data = ch;
root->left = create_tree();
root->right = create_tree();
return root;
}
// 非递归先序遍历
void preorder_traversal(TreeNode* root) {
if (!root) {
return;
}
Stack* s = init_stack(100);
push(s, root);
while (s->top > -1) {
TreeNode* node = pop(s);
printf("%c ", node->data);
if (node->right) {
push(s, node->right);
}
if (node->left) {
push(s, node->left);
}
}
}
int main() {
printf("请输入二叉树,#表示空节点:\n");
TreeNode* root = create_tree();
printf("非递归先序遍历结果为:\n");
preorder_traversal(root);
return 0;
}
```
在这个示例代码中,我们首先定义了一个二叉树节点的结构体`TreeNode`,其中包含了节点的数据`data`以及左右子节点的指针`left`和`right`。接着,我们定义了一个栈的结构体`Stack`,用于辅助实现非递归遍历。`init_stack`函数用于初始化栈,`push`函数用于将节点入栈,`pop`函数用于将节点出栈。
在`create_tree`函数中,我们使用递归的方式创建二叉树。读入一个字符,如果是`#`则表示这个节点为空,返回`NULL`;否则创建一个新节点,将这个字符赋值给节点的数据域,然后递归创建左右子树,并将左右子树的根节点分别赋值给节点的左右指针。
最后,在`preorder_traversal`函数中,我们使用非递归的方式实现了先序遍历。首先初始化一个栈,将根节点入栈。然后重复如下步骤:从栈中取出一个节点,输出它的数据域,并将它的右子节点和左子节点(如果存在)分别入栈。直到栈为空为止。
最终,我们在`main`函数中调用`create_tree`函数创建二叉树,然后调用`preorder_traversal`函数进行先序遍历,并将结果输出。
阅读全文