二叉树作为树这种数据结构的中非常经典的一种非线性不连续的数据结构,因其优良的时间复杂度而被广泛使用,在这篇文章中我们就来讲述一下二叉树的生成以及遍历。
例如下图中的二叉树我们如何解决它们的存储问题?
这里我们可以在输入时控制一下输入格式,就是我们可以在输入时先输入左子树在一个支路的左子树输入完成后设置一个结束标志再继续输入右子树,上图中我们就可以在输入是按照下面的格式进行输入:
ABC##DE###FG###
下面我们就直接看代码吧,代码中有些递归思想,如果有啥不懂的可以进行一下变量跟踪,这样看着也会更清晰一些。
void creatB_TREE(B_TREE **root) {
char ch;
scanf("%c",&ch);
if (ch == '#') {
*root = NULL;
} else {
*root = (B_TREE *) calloc(sizeof(B_TREE), 1);
(*root)->data = ch;
creatB_TREE(&((*root)->leftChild));
creatB_TREE(&((*root)->rightChild));
}
}
这个函数写完之后我们来看一下二叉树的遍历,二叉树的遍历分为三种分别是先根序,中根序,后根序。看起来是三种类型其实他们的代码只有一点点的差别,我们以“先根序”为例来讲一下二叉树的遍历。
所谓先根序就是先访问根节点将其中的数据取出然后将根节点的左子树当成根节点对待继续访问其中的数据左子树访问完后再去访问右子树。这其中也有些递归思想,建议大家进行一下变量跟踪方便理解。
void preRootOrder(B_TREE *root) {
if (root) {
printf("[%c] ",root->data);
preRootOrder(root->leftChild);
preRootOrder(root->rightChild);
}
}
理解上面的代码后我们就直接跟上中根序和后根序的代码,它们的差别很小,只有什么时候取出根节点中的数据这点小区别。
void posteriorRootOrder(B_TREE *root){
if (root) {
posteriorRootOrder(root->leftChild);
posteriorRootOrder(root->rightChild);
printf("[%c] ",root->data);
}
}
void middleRootOrder(B_TREE *root) {
if (root) {
middleRootOrder(root->leftChild);
printf("[%c] ",root->data);
middleRootOrder(root->rightChild);
}
}
最后我们来看看完整代码以及运行情况:
#include <stdio.h>
#include <malloc.h>
typedef struct B_TREE {
char data;
struct B_TREE *leftChild;
struct B_TREE *rightChild;
}B_TREE;
void creatB_TREE(B_TREE **root);
void preRootOrder(B_TREE *root);
void middleRootOrder(B_TREE *root);
void posteriorRootOrder(B_TREE *root);
void posteriorRootOrder(B_TREE *root){
if (root) {
posteriorRootOrder(root->leftChild);
posteriorRootOrder(root->rightChild);
printf("[%c] ",root->data);
}
}
void middleRootOrder(B_TREE *root) {
if (root) {
middleRootOrder(root->leftChild);
printf("[%c] ",root->data);
middleRootOrder(root->rightChild);
}
}
void preRootOrder(B_TREE *root) {
if (root) {
printf("[%c] ",root->data);
preRootOrder(root->leftChild);
preRootOrder(root->rightChild);
}
}
void creatB_TREE(B_TREE **root) {
char ch;
scanf("%c",&ch);
if (ch == '#') {
*root = NULL;
} else {
*root = (B_TREE *) calloc(sizeof(B_TREE), 1);
(*root)->data = ch;
creatB_TREE(&((*root)->leftChild));
creatB_TREE(&((*root)->rightChild));
}
}
int main() {
B_TREE *root = NULL;
printf("please input your data,'#' is symbol of over:");
creatB_TREE(&root);
printf("preRootOrder:");
preRootOrder(root);
printf("\n");
printf("middleRootOrder:");
middleRootOrder(root);
printf("\n");
printf("posteriorRootOrder:");
posteriorRootOrder(root);
printf("\n");
return 0;
}
有什么问题可以在下面留言,谢谢观看。