用C语言,实现二叉树的中序遍历和后序遍历的递归和非递归算法。
时间: 2024-11-29 19:36:41 浏览: 25
在C语言中,我们可以使用结构体来表示二叉树节点,然后分别实现中序遍历(Inorder Traversal)和后序遍历(Postorder Traversal)的递归和非递归版本。
**1. 递归实现:**
对于中序遍历(先左后根后右),递归版可以这样写:
```c
void inorder_recursive(struct TreeNode* root) {
if (root != NULL) {
inorder_recursive(root->left);
printf("%d ", root->val); // 遍历当前节点
inorder_recursive(root->right);
}
}
```
后序遍历(先左后右后根),递归版类似:
```c
void postorder_recursive(struct TreeNode* root) {
if (root != NULL) {
postorder_recursive(root->left);
postorder_recursive(root->right);
printf("%d ", root->val); // 最后访问当前节点
}
}
```
**2. 非递归实现(使用栈):**
中序遍历的非递归版通常采用“前驱后继”策略,即先将所有左子节点压入栈,然后弹出节点并访问其右子节点和自身:
```c
void inorder_iterative(struct TreeNode* root) {
struct TreeNode *stack[100];
int top = -1;
while (root || top != -1) {
while (root) {
stack[++top] = root;
root = root->left;
}
root = stack[top--]; // 弹出最左边的节点
printf("%d ", root->val);
root = root->right;
}
}
同样,后序遍历的非递归版会先访问左子节点和右子节点,最后访问根节点:
```c
void postorder_iterative(struct TreeNode* root) {
struct TreeNode *stack[100], *lastVisited = NULL;
int top = -1;
while (root || top != -1) {
while (root) {
stack[++top] = root;
root = root->left;
}
if (!root && lastVisited) {
root = lastVisited;
lastVisited = NULL;
} else {
root = stack[top--];
if (!lastVisited)
lastVisited = root;
root = root->right;
}
printf("%d ", root->val);
}
}
```
阅读全文