-
二叉树的单一个体 → 一个节点、两个指针,结构体的定义和双向链表类似
-
二叉树可以存任何类型的数据:这里选择存 char 类型数据
二叉树的结构体描述
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
typedef struct Node
{
char data; //顶点数据
struct Node* LChild; //左子树指针
struct Node* RChild; //右子树指针
}TREE,*LPTREE;
创建节点
LPTREE createNode(char data)
{
//动态内存申请
LPTREE newNode = (LPTREE)malloc(sizeof(TREE));
assert(newNode);
//给数据、指针做初始化->对于单个节点左右子树为空
newNode->data = data;
newNode->LChild = NULL;
newNode->RChild = NULL;
return newNode;
}
插入节点
-
采用先把节点创建出来,然后再连接的方式
//插在哪个节点后面 插入的左子树的节点 插入的右子树的节点
void insertNode(LPTREE parent, LPTREE LChild, LPTREE RChild)
{
//父节点的左子树指针指向左子树传过来的节点
parent->LChild = LChild;
//父节点的右子树指针指向右子树传过来的节点
parent->RChild = RChild;
}
递归法打印
前序 根左右
//打印以当前节点为根节点的树
void preOrder(LPTREE root)
{
//当前节点不为空
if (root != NULL)
{
//先打印根节点
printf("%c", root->data);
//往左边走
preOrder(root->LChild);
//往右边走
preOrder(root->RChild);
}
}
中序 左根右
void midOrder(LPTREE root)
{
if (root != NULL)
{
midOrder(root->LChild);
printf("%c", root->data);
midOrder(root->RChild);
}
}
后序 左右根
void lastOrder(LPTREE root)
{
if (root != NULL)
{
lastOrder(root->LChild);
lastOrder(root->RChild);
printf("%c", root->data);
}
}
递归创建
-
根据前序遍历的结果进行递归法创建二叉树
-
会修改表头,传入二级指针
-
注意需要把 NULL 也放进去
void createTree(LPTREE* T)
{
char userKey = 0;
scanf_s("%c", &userKey, 1); //让用户输入串 用#表示空
//ABD##EG###C#FH###
if (userKey == '#') //为空
{
*T = NULL; //让指针指向NULL
}
else //不为空
{
*T = (LPTREE)malloc(sizeof(TREE)); //动态内存申请 创建节点
assert(*T);
//给左右子树做初始化
(*T)->data = userKey; //数据等于用户数据
createTree(&(*T)->LChild); //左右子树需要再次创建
createTree(&(*T)->RChild);
}
}
测试代码
int main()
{
//创建二叉树->无序的树创建节点
LPTREE A = createNode('A'); //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');
LPTREE H = createNode('H');
//一个个连接
insertNode(A, B, C); //在A下面插入B、C
insertNode(B, D, E); //在B下面插入D、E
insertNode(E, G, NULL);
insertNode(C, NULL, F);
insertNode(F, H, NULL);
//打印结果
preOrder(A); //ABDEGCFH
printf("\n");
midOrder(A); //DBGEACHF
printf("\n");
lastOrder(A); //DGEBHFCA
printf("\n");
LPTREE A = NULL; //输入串ABD##EG###C#FH###Enter后得到相同的遍历结果
createTree(&A);
return 0;
}