题目要求:
编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。 例如如下的先序遍历字符串: ABC##DE#G##F### 其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果。
例题分析:
题目要求以先序创建一个二叉树,以题中给的字符串"ABC##DE#G##F###"为例,则二叉树的整体形状应该是
关于这个二叉树的创建:
按常规流程是写一个函数然后函数递归,直接上手!
typedef struct TreeNode
{
char val; // 存放值
struct TreeNode* left; // 左子树
struct TreeNode* right; // 右子树
}TNode;
void TreeBuild(TNode** pRoot, char** Pc)
{
if (*(*Pc) == '#')
{
++*Pc;
return;
}
else
{
// 开辟
TNode* newnode = (TNode*)malloc(sizeof(TNode));
newnode->left = NULL;
newnode->right = NULL;
*pRoot = newnode;
newnode->val = **Pc;
(*Pc)++;
TreeBuild(&((*pRoot)->left), Pc);
TreeBuild(&((*pRoot)->right), Pc);
}
}
在这里采用了二级指针,因为传入的指针Pc和pRoot如果是实际参数的临时拷贝则无法修改外界的值,因此选择传入指针的地址来达到修改指针的目的。
Pc是字符串的地址的地址,而pRoot是根结点Root的地址,其中Root是指向根的指针,因此在这里都是二级指针,这个函数的调用,在这里展示一下函数的调用:
char s[100];
char* ps = s;
scanf("%s", s);
TNode* root = NULL;
TreeBuild(&root, &ps);
最后直接中序遍历二叉树就可以了,也是写一个递归函数:
void inderpush(TNode* root)
{
if (root == NULL)
{
printf("# ");
return;
}
inderpush(root->left);
printf("%c ", root->val);
inderpush(root->right);
}
由于是IO类型的题目,整合一下main函数对上述两个函数的调用:
int main()
{
char s[100];
char* ps = s;
scanf("%s", s);
TNode* root = NULL;
TreeBuild(&root, &ps);
inderpush(root);
return 0;
}
完美!