题目要求
编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。 例如如下的先序遍历字符串: ABC##DE#G##F### 其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果。
思路
这个题本身并不是接口类型的题,因此需要我们自己构建一个树的结构体,首先我们需要根据给的数组进行树的重建,因为题目给的是先序遍历,因此,开始给的所有的非空节点都是最左边的节点,通过先序遍历根左右的特点对树进行重建,然后再调用中序遍历打印出树。
代码实现
#include <stdio.h>
#include <stdlib.h>
typedef struct TreeNode
{
struct TreeNode* left;
struct TreeNode* right;
char val;
}TreeNode;
TreeNode* reBuildTree(char* str, int* pi)
{
if (str[*pi] == '#')
{
return NULL;
}
TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode));
root->val = str[*pi];
(*pi)++;
root->left = reBuildTree(str, pi);
(*pi)++;
root->right = reBuildTree(str, pi);
return root;
}
void InOrderTree(TreeNode* root)
{
if (root == NULL)
{
return;
}
InOrderTree(root->left);
printf("%c ", root->val);
InOrderTree(root->right);
}
int main()
{
char str[100];
while (scanf("%s", str) != EOF)
{
int i = 0;
TreeNode* tree = reBuildTree(str, &i);
InOrderTree(tree);
printf("\n");
}
return 0;
}