数据结构初阶:二叉树的链式存储结构
在上一篇文章中,我们学习了二叉树的顺序存储(堆结构)。既然有顺序存储,自然也有链式存储。本文将重点讲解二叉树的链式结构及其基本操作。
一、二叉树的链式结构
链式结构通常与链表类似。二叉树主要分为二叉链和三叉链,本阶段我们以二叉链为主。节点结构体定义如下:
// 链式二叉树的节点定义
typedef struct BinaryTree {
Elemtype data;
struct BinaryTree* leftChild;
struct BinaryTree* rightChild;
} BTNode;
每个节点包含数据域和两个指针域,分别指向左子树和右子树。这种结构灵活,适合动态创建的二叉树。
二、二叉树的创建
为了便于理解基本性质,我们先手动创建一棵二叉树,暂不涉及复杂的增删查改逻辑。
2.1 创建二叉树节点
节点创建与链表类似,主要涉及内存分配和初始化:
// 创建新节点
BTNode* BuyNode(Elemtype data) {
BTNode* newNode = (BTNode*)malloc(sizeof(BTNode));
if (newNode == NULL) {
perror("create new node fail!\n");
return NULL;
}
newNode->data = data;
newNode->leftChild = newNode->rightChild = NULL;
return newNode;
}
注意:申请空间后务必检查是否为空,并记得返回新节点地址。
2.2 二叉树节点的链接
通过 BuyNode 创建节点后,手动建立连接关系:
BTNode* createNewBT() {
// 创建节点 A-I, O
BTNode* NodeA = BuyNode('A');
BTNode* NodeB = BuyNode('B');
BTNode* NodeC = BuyNode('C');
BTNode* NodeD = BuyNode('D');
BTNode* NodeE = BuyNode();
BTNode* NodeF = BuyNode();
BTNode* NodeG = BuyNode();
BTNode* NodeH = BuyNode();
BTNode* NodeI = BuyNode();
BTNode* NodeO = BuyNode();
NodeA->leftChild = NodeB; NodeA->rightChild = NodeC;
NodeB->leftChild = NodeD; NodeB->rightChild = NodeE;
NodeD->leftChild = NodeH;
NodeC->leftChild = NodeF;
NodeF->leftChild = NodeI;
NodeH->leftChild = NodeO;
NodeA;
}


