目录
1:题目分析和思路
1:分析
2:思路
2:代码实现及分析
1:构建结构体
2:主函数
2:创建二叉树
3:中序遍历
3:总代码
1:题目分析和思路
1:分析
读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。
例如如下的先序遍历字符串: ABC##DE#G##F### 其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果
2:思路
字符串:ABC##DE#G##F### 的二叉树展开图如下:
上图是我们用前序(根 左子树 右子树)对字符串数组进行展开,通过以上的展开,可以方便我们更好的理解和代码的书写以及我们思路的展开;
通过对字符串的展开,我们接下来需要先读取字符串、构建二叉树 并用中序打印二叉树;
2:代码实现及分析
1:构建结构体
typedef struct BinTreeNode
{
struct BinTreeNode* left;
struct BinTreeNode* right;
char val;
}BTNode;
我们要先建立一个结构体,根节点val,左子树left,右子树right
2:主函数
int main()
{
char a[100];
//读入字符串
scanf("%s", &a);
//创建二叉树
int i = 0;
BTNode* root = CreateTree(a, &i);
//中序打印二叉树
InOrder(root);
return 0;
}
分析:首先我们在main函数中接收一下字符串的值,因为题目归定了字符串不超过100,所以我们让a的范围到100,然后用scanf来读取,并且需要创建一颗二叉树,创建好以后再按照题目要求用中序打印二叉树
这里我们在对下标i进行传值时,需要传地址(&),以便于我们改变实参(++i)时形参也跟着改变
2:创建二叉树
//创建二叉树
BTNode* CreateTree(char* a, int* pi)
{
if (a[*pi] == '#')
{
(*pi)++;
return NULL;
}
BTNode* root = (BTNode*)malloc(sizeof(BTNode));
root->val = a[(*pi)++];
root->left = CreateTree(a, pi);
root->right = CreateTree(a, pi);
return root;
}
实参i的地址我们用*pi来接收
分析:当a[*pi]访问到字符串的值是字符是'#'时,我们让(*pi)向后++(字符位置向后移动一个位置),然后返回NULL,访问到'#'就说明访问到叶子节点的左右子树了;
如果没有访问到'#',就说明访问到了值,我们为这个值开辟一块空间,然后我们让二叉树的值(val)的指针*pi向后++;让指针指向下一个字符(字符位置向后移动一个位置)
然后我们进行递归调用,让root->left和root->right都进行递归,并创建我们访问到的值左右子树
3:中序遍历
//中序打印二叉树
void InOrder(BTNode* root)
{
if (root == NULL)
return;
InOrder(root->left);
printf("%c ", root->val);
InOrder(root->right);
}
分析:如果树是空树,直接返回;然后用按照中序的方法(左子树 根 右子树)递归树的左边 打印根节点 在递归树的右边
3:总代码
#include <stdio.h>
#include <stdlib.h>
typedef struct BinTreeNode
{
struct BinTreeNode* left;
struct BinTreeNode* right;
char val;
}BTNode;
//创建二叉树
BTNode* CreateTree(char* a, int* pi)
{
if (a[*pi] == '#')
{
(*pi)++;
return NULL;
}
BTNode* root = (BTNode*)malloc(sizeof(BTNode));
root->val = a[(*pi)++];
root->left = CreateTree(a, pi);
root->right = CreateTree(a, pi);
return root;
}
//中序打印二叉树
void InOrder(BTNode* root)
{
if (root == NULL)
return;
InOrder(root->left);
printf("%c ", root->val);
InOrder(root->right);
}
int main()
{
char a[100];
//读入字符串
scanf("%s", &a);
//创建二叉树
int i = 0;
BTNode* root = CreateTree(a, &i);
//中序打印二叉树
InOrder(root);
return 0;
}
以上就是二叉处OJ———二叉树构建及遍历的所有分析和理解了,创作不易,求求大家点个小赞赞,感谢各位大佬们的赏脸观看,随手点个赞,养成好习惯,如有问题,感谢反馈!