https://www.nowcoder.com/practice/4b91205483694f449f94c179883c1fef?tpId=60&&tqId=29483&rp=1&ru=/activity/oj&qru=/ta/tsing-kaoyan/question-ranking
这个题目和leetcode比起来就是有一些不一样,需要我们自己来写接口函数,所以有一些麻烦,我们得写一个中序遍历的函数做最后的输出,也得写一个函数来存储字符进去,还得写一个接口函数来创造节点,这个题目就和二叉树如何创造节点很相似,我们一个一个接口来进行分析,首先我这里直接给出大家需要的结构体。
typedef struct TreeNode
{
char val;
struct TreeNode* left;
struct TreeNode* right;
}TreeNode;
这个就是很基础的结构体中的内容,因为我们每次放字符进去需要创造节点,我们这样就可以继续写一个创造节点的函数,我们来看看。、
TreeNode* CreatNode(char x)
{
TreeNode* newnode = (TreeNode*)malloc(sizeof(TreeNode));
newnode->val = x;
newnode->left = newnode->right = NULL;
return newnode;
}
接下来难得其实就是我们如何把这些字符放到这个里面我们对着代码讲可能简单理解一点。
TreeNode* maketree(char* a, int* pi)
{
if(a[*pi] == '#')
{
(*pi)++;
return NULL;
}
TreeNode* root = CreatNode(a[(*pi)++]);
root->left = maketree(a, pi);
root->right = maketree(a, pi);
return root;
}
我们得子问题就是一个父亲节点和两个孩子节点应该怎么进行链接,我们遇到字符‘#’得时候就得返回空指针,如果不是空得时候就得创造节点,把值放进去,然后进行遍历得就行,但是我们需要进行链接,所以root得left和right要指向我们得函数递归得地方,大家也可以画画递归展开图进行理解。
我们前序存储就需要变成这样得一棵树。
完整代码
#include<stdio.h>
typedef struct TreeNode
{
char val;
struct TreeNode* left;
struct TreeNode* right;
}TreeNode;
TreeNode* CreatNode(char x)
{
TreeNode* newnode = (TreeNode*)malloc(sizeof(TreeNode));
newnode->val = x;
newnode->left = newnode->right = NULL;
return newnode;
}
TreeNode* maketree(char* a, int* pi)
{
if(a[*pi] == '#')
{
(*pi)++;
return NULL;
}
TreeNode* root = CreatNode(a[(*pi)++]);
root->left = maketree(a, pi);
root->right = maketree(a, pi);
return root;
}
void Inorder(TreeNode* root)
{
if(root == NULL)
{
return ;
}
Inorder(root->left);
printf("%c ",root->val);
Inorder(root->right);
}
int main()
{
char arr[101];
scanf("%s",arr);
int count = 0;
TreeNode* tree = maketree(arr,&count);
Inorder(tree);
return 0;
}
又是水文章得一天。