上个博客整理了二叉树的基础知识,这里是链接:二叉树的一些基本知识
了解到基本要点和基本结构后,我们来实现一下这个数据结构:
首先我们得了解到这个数据结构的单体是什么样子的,他单体包括了数据和两个指向左右孩子的指针
所以我们用结构体写出来这个二叉树节点:
typedef struct treenode {
char data;
struct treenode* Lchild;
struct treenode* Rchild;
}TREE,*LPTREE;
因为这个节点名字太长了,我就起个别名,这里要注意的是我的 treenode*这个类型的起别名方式
一般来说LPXXXXX代表一个一级指针
然后就是创建一个这样的节点的函数
需要的是分配空间,赋值数据,指针置空初始化
接下来是代码
LPTREE createnode(char data) {
LPTREE newnode = (LPTREE)malloc(sizeof(TREE));
newnode->data = data;
newnode->Lchild = NULL;
newnode->Rchild = NULL;
return newnode;
}
树的节点能够创建,那么就是连接各个节点,成为一个树。
需要参数的是父节点,左节点,右节点。
然后就是指针指向的问题,比如a节点作为父节点,b为左孩子,c为右孩子,
我就需要的是将a的左孩子指针指向b,右孩子指针指向c
那么实现一下这个代码:
void tree(LPTREE dad, LPTREE left, LPTREE right) {
dad->Lchild = left;
dad->Rchild = right;
}
那么这个树建立需要的函数我们已经实现好了,接下来是,遍历的问题,这节我采用递归的方法实现,虽然不好理解但是代码少,具体我会再注释的:
先实现一下打印当前节点的函数:
void printnode(LPTREE node) {
printf("%c\t", node->data);
}
接下来是前序遍历,看我上一个博客,前序遍历是根 左 右,所以我们走到根节点就打印,然后访问左节点,以这个节点作为根节点,打印一下,然后走到没有左节点的时候,访问右节点,右节点作为根节点。。。。。循环往复,这就是递归实现
void printbypre(LPTREE root) {
if (root != NULL) {//根节点不为空的时候
printnode(root);//先打印根节点
printbypre(root->Lchild);//打印过根节点,然后就访问左节点,吧左节点当作下一个的父节点
printbypre(root->Rchild);//这个应该就是没有左节点的时候就返回到这里来了,也就是开始以右节点为根节点往下递归
}
}
我们来创建这样的树来检查一下前序遍历:
主函数:
int main() {
LPTREE A = createnode('A');
LPTREE B = createnode('B');
LPTREE C = createnode('C');
LPTREE D = createnode('D');
LPTREE E = createnode('E');
LPTREE F = createnode('F');
LPTREE G = createnode('G');
tree(A, B, C);
tree(B, D, NULL);
tree(D, NULL, E);
tree(C, NULL, F);
tree(F, G, NULL);
printf("前序遍历:\n");
printbypre(A);
效果图
证明是正确的
那么, 中序遍历是,左 根 右 ,那么就是先是访问到最左边的节点作为根节点打印,然后它的根节点打印,返回到根节点(递归回去),然后访问右孩子的节点,循环往复,那么实现过来其实跟上面的没什么区别
代码:
void printbymid(LPTREE root) {
if (root != NULL) {
printbypre(root->Lchild);
printnode(root);
printbypre(root->Rchild);
}
}
效果图:
聪明的小伙伴已经发现了一些亮点,只要调换顺序就可以了,当然你可以死背这个模板,但是最好还是理解一下这个递归过程,画画图,理解一下:
void printbyhou(LPTREE root) {
if (root != NULL) {
printbypre(root->Lchild);
printbypre(root->Rchild);
printnode(root);
}
}
效果图:
其实吧,这样的结构跟链表十分相似,所以学过链表结构很容易掌握,不过不容易理解的就是递归遍历这个过程了吧。
好了今天的数据结构二叉树的博客就到这了。