用c语言编写 采用二叉链表存储方式构建二叉树,并对其进行先序、中序、后序遍历的递归算法和和非递归算法。
时间: 2024-11-12 09:33:39 浏览: 19
在C语言中,我们可以使用结构体表示节点并利用指针构成二叉链表的方式来创建二叉树。以下是基本的二叉树节点定义:
```c
typedef struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
```
接下来,我们分别讨论先序(根-左-右)、中序(左-根-右)和后序(左-右-根)遍历的递归和非递归算法。
### 递归算法
**先序遍历(递归)**
```c
void preorderTraversal(TreeNode* root) {
if (root != NULL) {
printf("%d ", root->val); // 访问根节点
preorderTraversal(root->left); // 遍历左子树
preorderTraversal(root->right); // 遍历右子树
}
}
```
**中序遍历(递归)**
```c
void inorderTraversal(TreeNode* root) {
if (root != NULL) {
inorderTraversal(root->left); // 遍历左子树
printf("%d ", root->val); // 访问根节点
inorderTraversal(root->right); // 遍历右子树
}
}
```
**后序遍历(递归)**
```c
void postorderTraversal(TreeNode* root) {
if (root != NULL) {
postorderTraversal(root->left); // 遍历左子树
postorderTraversal(root->right); // 遍历右子树
printf("%d ", root->val); // 访问根节点
}
}
```
### 非递归算法 - 先序遍历
**使用栈实现非递归先序遍历**
```c
void preorderTraversalNonRecursive(TreeNode* root) {
stack<TreeNode*> s;
TreeNode* curr = root;
while (curr != NULL || !s.empty()) {
while (curr != NULL) {
printf("%d ", curr->val);
s.push(curr);
curr = curr->left;
}
curr = s.top();
s.pop();
curr = curr->right;
}
}
```
同样的,你可以为中序和后序遍历添加类似的方法,只是调整访问根节点的时机。
阅读全文