使用C语言,实现二叉树的中序遍历和后序遍历的递归和非递归算法。
时间: 2024-11-29 15:36:23 浏览: 29
在C语言中,二叉树的中序遍历和后序遍历是非常基础的操作。以下是这两种遍历的递归和非递归算法:
**递归实现:**
```c
// 定义二叉树节点结构体
typedef struct TreeNode {
int val;
struct TreeNode* left;
struct TreeNode* right;
} TreeNode;
// 中序遍历(根左右)
void inorderTraversalRec(TreeNode* root) {
if (root != NULL) {
inorderTraversalRec(root->left);
printf("%d ", root->val); // 先访问左子树
inorderTraversalRec(root->right); // 再访问右子树
}
}
// 后序遍历(根左右)
void postorderTraversalRec(TreeNode* root) {
if (root != NULL) {
postorderTraversalRec(root->left);
postorderTraversalRec(root->right);
printf("%d ", root->val); // 最后访问根节点
}
}
```
**非递归实现(利用栈):**
```c
void inorderTraversalNonRec(TreeNode* root) {
stack<TreeNode*> s;
TreeNode* current = root;
while (current || !s.empty()) {
while (current) {
s.push(current);
current = current->left;
}
current = s.top();
s.pop();
printf("%d ", current->val); // 访问节点
current = current->right; // 转向右子树
}
}
void postorderTraversalNonRec(TreeNode* root) {
stack<TreeNode*> s1, s2;
s1.push(root);
while (!s1.empty()) {
TreeNode* node = s1.top();
s1.pop();
s2.push(node);
if (node->left) s1.push(node->left);
if (node->right) s1.push(node->right);
}
while (!s2.empty()) {
printf("%d ", s2.top()->val);
s2.pop();
}
}
```
阅读全文