二叉树是树结构中最简单的,一颗树只有一个根结点,且所有结点的子结点不超过2个。
例如:
遍历二叉树有3种遍历方式:
先序遍历(根左右)
中序遍历(左根右)
后序遍历(左右根)
这三种遍历,我是通过这篇博客了解的,十分形象,超级推荐http://t.csdn.cn/0tOlo
了解完以上内容之后,我就开始构建二叉树,通过链表的形式,每个结点需要有3个内容
这个的结点表示的数据,还要能通过这个结点找到它的左孩子和右孩子。
根据二叉树的先序遍历,我们可以构建二叉树,我们可以先给根一个数据,然后通过这个根找到它的左子树,给左子树填充完数据之后,回到根,通过根找到右子树,填充右子树。这和递归函数的进出很像,因此我们在构建二叉树的时候,可以通过递归构建。
#include<bits/stdc++.h>
using namespace std;
struct node{
char data;
node *lchild;
node *rchild;
};
node* creat()
{
char data;
node *t;
scanf("%c",&data);
if(data!='#')
{
t=(node*)malloc(sizeof(node));
t->data=data;
// printf("please input left child of %c:",data);
t->lchild=creat();
// printf("please input right child of %c:",data);
t->rchild=creat();
return t;
}
else
{
return NULL;
}
}
void DLR(node *tree)//前序遍历
{
if(tree==NULL)
{
return;
}
printf("%c",tree->data);
DLR(tree->lchild);
DLR(tree->rchild);
}
void LDR(node *tree)//中序遍历
{
if(tree==NULL)
{
return;
}
LDR(tree->lchild);
printf("%c",tree->data);
LDR(tree->rchild);
}
void LRD(node *tree)
{
if(tree==NULL)
{
return;
}
LRD(tree->lchild);
LRD(tree->rchild);
printf("%c",tree->data);
}
void free(node *tree)
{
if(tree==NULL)
{
return;
}
free(tree->lchild);
free(tree->rchild);
tree=NULL;
}
int main()
{
node *tree;
tree=creat();
DLR(tree);
printf("\n");
LDR(tree);
printf("\n");
LRD(tree);
printf("\n");
free(tree);
return 0;
}
//CBA##DE##F##GH###
运行结果
输出完之后,记得通过free函数来释放内存。
我们释放内存要自下往上,也就是后序遍历,不然找到北。