目录
题述:
思路:
正确代码:
题述:
编写一程序,读入用户输出的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。例如如下的先序遍历字符串:ABC##DE#G##F###其中“#”表示的是空格,空格符号代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果。
输入描述:
输入包括1行字符串,长度不超过100。
输出描述:
可能有多组测试数据,对于每组测试数据。
输出将输入字符串建立二叉树后中序遍历的序列。每个字符后面都有一个空格。
每个输出结果占一行。
示例1:
输入:
abc##de#g##f###
输出:
c b e g d f a
给你 abc##de#g##f###,因其是先序遍历,它的二叉树应如下:
思路:
①、根据给的字符串按照前序遍历构建二叉树(重点)
②、根据构建好的二叉树进行中序遍历
构建二叉树的过程用先序遍历就好了,给根赋值,然后再遍历左子树,左子树再次为根,再遍历左子树,左子树再次为根,直到为'#'(其实就是NULL,空树),再看右子树,跟左子树一样的遍历过程,直到为'#',再一层一层往回返。注:当字符串为空时,下标也应该++,进而构建字符串的下一个字符,构建二叉树时并不会构建出'#',只会把它当为NULL而不管。
正确代码:
#include<stdio.h>
#include<stdlib.h>
typedef struct TreeNode
{
char val;
struct TreeNode* left;
struct TreeNode* right;
}TreeNode;
//根据字符串构建前序遍历的二叉树
TreeNode* CreateTree(char* str, int* pi)
{
if (str[*pi] == '#')
{
(*pi)++;
return NULL;
}
else
{
TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode));
root->val = str[(*pi)++];
//因为是递归,所以每次都要传地址才行
root->left = CreateTree(str, pi);
root->right = CreateTree(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];
scanf("%s", str);
int i = 0;
TreeNode* root = CreateTree(str, &i);
InorderTree(root);
return 0;
}