题目来源:牛客网清华考研oj题
http://www.nowcoder.com/questionTerminal/4b91205483694f449f94c179883c1fef
题目:如下图
答案:如下图
#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];
(*pi)++;
root->left = CreateTree(str, pi);
root->right = CreateTree(str, pi);
return root;
}
}
//中序遍历
void OrderTree(TreeNode* root)
{
if (root == NULL)
{
return;
}
else
{
OrderTree(root->left);
printf("%c ", root->val);
OrderTree(root->right);
}
}
int main()
{
char str[100];
scanf("%s", str);
int i = 0;
TreeNode* root = CreateTree(str, &i);//创建根接收
OrderTree(root);
return 0;
}
解析:
(1)创建数组读取字符串
这里注意读取字符串是%s
char str[100];
scanf("%s", str);
(2)重构树并创建根接收
int i = 0;
TreeNode* root = CreateTree(str, &i);//创建根接收
这里我们创建CreateTree()函数,传入数组str和变量i,为了保证在递归时当且仅有一个变量值i,防止上一层i=3,下一层i=4,当下一层i=4返回到上一层时上一层的i值仍然不变为3,故我们传入i的地址
TreeNode* CreateTree(char* str, int* pi)
{
//当用i访问数组的值为#时,说明数组中储存为空,继续访问下一个数组字符需要使i++;
if (str[*pi] == '#')
{
(*pi)++;
return NULL;
}
else
{
//开辟结点空间
TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode));
//由于题目中是前序遍历即先序遍历这里我们先将str值储存到结点root中,(*pi)++,调用左子树进行递归再递归调用右子树
root->val = str[*pi];
(*pi)++;
root->left = CreateTree(str, pi);
root->right = CreateTree(str, pi);
return root;
}
}
(3)中序遍历
void OrderTree(TreeNode* root)
{
if (root == NULL)
{
return;
}
else
{
//这里需要注意打印时字符的是%c ,并且题目中要求进行中序遍历,打印后面留一个空格
OrderTree(root->left);
printf("%c ", root->val);
OrderTree(root->right);
}
}
(4)调用中序遍历并且返回
OrderTree(root);
return 0;
到这里我们解题完毕
如果对您有帮助的话点一个免费的赞和收藏叭!
由于作者水平不足,如果有任何错误,麻烦读者评论在评论区指点一下,谢谢!