题目来源:链接:二叉树遍历__牛客网
题目描述:
编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。例如如下的先序遍历字符串: ABC##DE#G##F### 其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果。
示例1
输入
abc##de#g##f###输出
c b e g d f a
代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct BinaryTreeNode {
struct BinaryTreeNode* left;
struct BinaryTreeNode* right;
char val;
}TNode;
void InOrder(TNode* root)//中序遍历
{
if (root == NULL) {
return;
}
InOrder(root->left);
printf("%c ", root->val);
InOrder(root->right);
}
TNode *CreateTree(char* a,int* pi)
{
if(a[*pi]=='#'){
++(*pi);
return NULL;
}
TNode* root = (TNode*)malloc(sizeof(TNode));
if(root == NULL){
printf("malloc fail\n");
exit(-1);
}
root->val=a[*pi];
(*pi)++;
root->left=CreateTree(a,pi);
root->right=CreateTree(a,pi);
return root;
}
int main(){
char str[100];
scanf("%s",str);
int i=0;
TNode* root=CreateTree(str,&i);
InOrder(root);
return 0;
}
思路:
我们需要对数组进行遍历,并且需要保证下标的变化,所以我们传入i的地址,遍历数组时,遇到#我们跳过,否则就构建树,因为得到的是先序遍历结果,而且得到了空格,所以我们可以直接推出树的结构,遇到两个空格说明到底了,在构建树时,每次使用完数组的内容也要让数组下标+1,在构建完当前节点后,构建该节点的左右子树。
运行结果: