算法:c语言输入字符序列,建立二叉树;按先序、中序、后序遍历二叉树(三种递归算法和中序遍历的非递归算法);
时间: 2024-05-07 21:19:26 浏览: 116
以下是C语言实现输入字符序列,建立二叉树,并按照先序、中序、后序递归遍历二叉树的算法:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct TreeNode {
char data;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
TreeNode* CreateTree() {
char ch;
TreeNode *p;
scanf("%c", &ch);
if (ch == '#') {
p = NULL;
} else {
p = (TreeNode*)malloc(sizeof(TreeNode));
p->data = ch;
p->left = CreateTree();
p->right = CreateTree();
}
return p;
}
void PreOrder(TreeNode *root) {
if (root) {
printf("%c ", root->data);
PreOrder(root->left);
PreOrder(root->right);
}
}
void InOrder(TreeNode *root) {
if (root) {
InOrder(root->left);
printf("%c ", root->data);
InOrder(root->right);
}
}
void PostOrder(TreeNode *root) {
if (root) {
PostOrder(root->left);
PostOrder(root->right);
printf("%c ", root->data);
}
}
int main() {
TreeNode *root = CreateTree();
printf("PreOrder: ");
PreOrder(root);
printf("\nInOrder: ");
InOrder(root);
printf("\nPostOrder: ");
PostOrder(root);
return 0;
}
```
其中,输入字符序列时,'#'表示该节点为NULL。
针对中序遍历的非递归算法,我们可以使用栈来实现。算法流程如下:
1. 初始化栈和当前节点指针p为根节点。
2. 当栈不为空或者p不为空时,进行以下操作:
- 如果p不为空,则将p压入栈中,并将p指针指向p的左子节点。
- 如果p为空,则弹出栈顶节点并访问该节点,然后将p指针指向栈顶节点的右子节点。
代码实现如下:
```c
void InOrderNonRecursive(TreeNode *root) {
if (root == NULL) {
return;
}
TreeNode *stack[100];
int top = -1;
TreeNode *p = root;
while (top >= 0 || p) {
if (p) {
stack[++top] = p;
p = p->left;
} else {
p = stack[top--];
printf("%c ", p->data);
p = p->right;
}
}
}
```
阅读全文