欢迎大家来到我的博客,给生活加点impetus!!
让我们进入《题海探骊》,感受算法之美!!
二叉树的构建及遍历
题目链接
题目详解
我们理清了题目部分,再来看代码部分:
这代表在该题目中所有部分都需要我们自己实现
不同于leetcode,leetcode大部分二叉树例题结构等系统自己就实现好了。
思路
创建数组读取用户输入的字符串->创建二叉树->中序遍历二叉树
为什么会想到创建数组读取用户输入呢?
因为是一串字符串,使用数组这种数据结构简洁高效
已知输入数据大小小于100
代码实现
因为二叉树结构定义,中序遍历和创建结点我们在上一节已经讲解,不懂的小伙伴可以移步二叉树常见方法的实现。
我们重点来讲解二叉树依靠数组创建:
当我们实现好二叉树结点创建后:
我们来实现二叉树的创建。
为什么需要传size的地址:
因为每一次函数递归都会创建新的函数栈帧,size也会有多个,在每个函数中都有函数栈帧,地址不同,size不会发生变化,只有传地址,才会对同一个size进行数据操作。
我们来看一下全部代码:
#include <stdio.h>
#include<stdlib.h>
typedef struct BinaryTreeNode{
char data;
struct BinaryTreeNode*left;
struct BinaryTreeNode*right;
}BTNode;
BTNode* BuyNode(char x)
{
BTNode*node=(BTNode*)malloc(sizeof(BTNode));
if(node==NULL)
{
perror("malloc failed!!");
exit(1);
}
node->data=x;
node->left=node->right=NULL;
return node;
}
BTNode* CreatBinaryNode(char*arr,int* pi)
{
if(arr[(*pi)]=='#')
{
(*pi)++;
return NULL;
}
BTNode* root=BuyNode(arr[(*pi)]);
(*pi)++;
root->left=CreatBinaryNode(arr,pi);
root->right=CreatBinaryNode(arr,pi);
return root;
}
void InOrder(BTNode*root)
{
if(root==NULL)
{
return;
}
InOrder(root->left);
printf("%c ",root->data);
InOrder(root->right);
}
int main() {
//根据用户输入的字符串存储在数组中
char arr[100];
scanf("%s",&arr[0]);
//将数组中的数据创建树
int i=0;
BTNode* root=CreatBinaryNode(arr,&i);
//中序遍历
InOrder(root);
return 0;
}
我们今天学到的主要是通过数组来创建二叉树。
结语
感谢大家认真阅读我的博客,希望能有更优的方法与我交流!! 乘舟侧畔千帆过,病树前头万木春!!道路坎坷,请保持希望!!