/*
ONE.二叉树基本常识
二叉树结构单体:有一个数据域,加上左子树指针和右子树指针,就是结构体写法
ONE.ONE.基本概念:
二叉树有五种形态
第一种:空的二叉树,就是一个结构体指针
第二种:只有根节点的二叉树(只有一个根节点,用tree指针表示)
第三种:只有左子树或右子树的二叉树(左子树:在结点左边的指针。右子树同理),就是单纯的单链表。。。
第四种:左右子树都存在
{
四.1.完全二叉树(除了最后一个节点之外,其他的都是满的,不过叶子结点可以缺少,但最后的不能左右都空,它从编号一开始,有孩子结点,父结点,兄弟节点,等等,父结点就是孩子节点的上面,编号从一开始,是为了实现孩子节点的序号 \ 2 = 父结点的序号,小数直接忽略)
四.2.满二叉树(除了叶子之外,其他的都是满的,叶子结点就是最后一层结点,不过左右子树都要完整的)
}
TWO.二叉树的遍历,就是不重复去打印
根节点最是最上面的那个,就是根
我们一般是用从左往右的顺寻
假设只有三个结构单体
{
1.先打印上方,然后再按从左往右打印
2.就只按从左往右打印,不管上与下的关系
3.先打印下面的从左往右,然后再打印上面的
}
所以我们看根节点在哪里,就是什么遍历方式
1.根在最前面,就是前序遍历,也叫先序遍历
2.根在中间,中序
3.跟在最后面,后序
在这里无法描述,因为我不懂如何插入图片
*/
#include<stdio.h>
#include<stdlib.h>
//描述单一个体,起别名
typedef struct treeNode
{
char data; //数据域用字符表示
struct treeNode* LChild; //左子树指针
struct treeNode*RChild; //右子树指针
}TREE,*LPTREE; //一般用用LP开头的,表示指针别名
//创建二叉树结点
LRTREE createNode(char data)
{
LRTREE newNode = (LRTREE)malloc(sizeof(TREE));
newNode->data = data;
newNode->LChild = NULL;
newNode->RChild = NULL;
return newNode;
}
//没有规律的树
void insertNode(LRTREE parentNode,LRTREE LChild, LRTREE RChild)
{
parentNode->LChild = LChild;
parentNode->RChild = RChild;
}
//打印当前节点的元素
void printCurNodeData(LRTREE curData)
{
printf("%c\t", cruData->data);
}
//递归法
//先序:根->左->右
void preOrder(LRTREE root)
{
if(root != NULL)
{
printCurNodeData(root); //打印根部节点,到左节点,最后右节点
preOrder(root->LChild);
preOrder(root->RChild);
//同样用了preOrder函数,使根节点,左节点,右节点都打印
}
}
//中序:左->根->右
void midOrder(LRTREE root)
{
if(root != NULL)
{
midOrder(root->LChild);//打印左节点,到根节点,最后右节点
printCurNodeData(root);
midOrder(root->RChild);
//同样用了midOrder函数,使根节点,左节点,右节点都打印
}
}
//后序:左->右->根
void lastOrder(LRTREE root)
{
if(root != NULL)
{
lastOrder(root->LChild);//打印左节点,到右节点,最后根节点
lastOrder(root->RChild);
printCurNodeData(root);
//同样用了lastOrder函数,使根节点,左节点,右节点都打印
}
}
int main()
{
/*死板的创建方式,无实际作用,就是将结点连接起来而已*/
LRTREE A = createNode('A');
LRTREE B = createNode('B');
LRTREE C = createNode('C');
LRTREE D = createNode('D');
LRTREE E = createNode('E');
LRTREE F = createNode('F');
LRTREE G = createNode('G');
insertNode(A , B ,C);
insertNode(B , D ,NULL);
insertNode(C , E ,F);
printf("\n先序遍历:\n");
preOrder(A);
printf("\n中序遍历:\n");
midOrder(A);
printf("\n中序遍历:\n");
lastOrder(A);
system("pause");
return 0;
}