二叉树的创建与遍历(链式结构)
大家好,我是小白莲
今天小白莲学会了二叉树的结构定义,创建、遍历,不要觉得二叉树很难,其实就是递归的应用。
好,废话少说,往下看吧。
1.二叉树结构的定义
指针域为左右两个孩子
//包含头文件
#include<stdio.h>
#include<stdlib.h>
//定义常量
#define OK 1
#define ERRROR 0
#define OVERFLOW -2
typedef char TElemType;
typedef int Status;
//定义二叉树链表的结构
typedef struct BiTNode {
TElemType data; //数据域
struct BiTNode* lchild; //左孩子指针域
struct BiTNode* rchild; //右孩子指针域
}BiTNode,*BiTree;
2.二叉树的创建
//按前序创建一个二叉树
void CreateBiTree(BiTree& tree) {
//依次输入字符创建二叉树,以'#'为空结点字符
TElemType s;
scanf_s("%c",&s);
if (s == '#')
tree = NULL;
else
{
//给结点申请空间
tree = (BiTree)malloc(sizeof(BiTNode));
if (!tree) exit(OVERFLOW); //申请存储空间失败
//给结点赋值
tree->data = s;//生成根节点
CreateBiTree(tree->lchild);//构造左子树
CreateBiTree(tree->rchild);//构造右子树
}
}
3.二叉树的遍历
3.1前序遍历法
//按前序遍历法,输出二叉树的所有元素
void PrePrint(BiTree tree) {
if (!tree)
return;
printf("%c", tree->data);
PrePrint(tree->lchild); //输出左子树的元素
PrePrint(tree->rchild); //输右左子树的元素
}
3.2中序遍历法
//按中序遍历法,输出二叉树的所有元素
void InPrint(BiTree tree) {
//如果当前孩子域为空,返回上一步操作
if (!tree)
return;
//进行中序遍历
InPrint(tree->lchild); //输出左子树的元素
printf("%c", tree->data);
InPrint(tree->rchild); //输右左子树的元素
}
3.3后序遍历法
//按后序遍历法,输出二叉树的所有元素
void LastPrint(BiTree tree) {
//若果当前孩子域为空,返回上一步操作
if (!tree)
return;
//进行后序遍历
LastPrint(tree->lchild); //输出左子树的元素
LastPrint(tree->rchild); //输出左子树的元素
printf("%c", tree->data);
}
4.测试
//测试
int main() {
BiTree btree;
//创建一颗二叉树,前序构造,输入的值为:
//ABDGK###H##E##CFI##J###
//调用CreateBiTree函数(前序法)创建二叉树,并输入值
CreateBiTree(btree);
调用PrePrint函数(前序法),输出二叉树的所有元素,
若为ABDGKHECFIJ 则输出成功
printf("前序:\n");
PrePrint(btree);
printf("\n");
调用InPrint函数(中序法),输出二叉树的所有元素,
若为KGDHBEAIFJC 则输出成功
printf("中序:\n");
InPrint(btree);
printf("\n");
//调用LastPrint函数(后序法),输出二叉树的所有元素,
//若为KGHDEBIJFCA 则输出成功
printf("后序:\n");
LastPrint(btree);
printf("\n");
return 0;
}
4.1测试结果
具体的树,大家可以自己根据前序加中序或者后序加中序把树画出来,不多,五层的树而已,哈哈,小白的话最好动手试试,想对答案的可以联系我
end
给人点赞,手留余香
预知后续操作如何,请看下集
@author 白莲居仙 QQ:1131977233