二叉树的建立
由于树是非线性结构,创建一颗二叉树必须首先确定树中结点的输入顺序,常用方法是先序创建和层序创建。
层序创建所用的节点输入序列是按数的从上至下从左到右的顺序形成的各层的空结点输入数值0。在构造二叉树过程中需要一个队列暂时存储各节点的地址,其创建过程如下:
- 输入第一个数据
· 若为0,表示此树为空,将空指针赋给根指针,树构造完毕
· 若不为0,动态分配一个结点单元,并存入数据,同时将该结点地址放入队列。 - 若队列不为空,从队列中取出一个结点地址,并建立该节点的左右孩子。
· 从输入序列中读入下一个数据
若读入的数据为零,将出队节点的左孩子指针置空,否则分配一个节点单元存入所读数值,并将其作为出对节点的左孩子,同时将此孩子的地址入队
· 接着再从输入序列中读入下一个数据
若读入的数据为零,将出队节点的右孩子指针置空,否则分配一个节点单元存入所读数值,并将其作为出对节点的右孩子,同时将此孩子的地址入队 - 重复第二步过程,直到队列为空,再无节点出队。
代码实现层序创建二叉树
BinTree CreateBinTree() {
ElementType Data;
BinTree BT, T;
Queue Q = CreateQueue(100);
int sum = 0;
scanf_s("%d", &Data);
if (Data != 0) {
BT = (BinTree)malloc(sizeof(struct TNode));
BT->Data = Data;
BT->Left = NULL;
BT->Right = NULL;
AddQ(Q, BT);
}
else return NULL;
while ((!IsEmptyQ(Q)) && sum < 3) {
sum++;
scanf_s("%d", &Data);
T = DeleteQ(Q);
if (Data == 0) {
T->Left = NULL;
}
else {
T->Left = (BinTree)malloc(sizeof(struct TNode));
T->Left->Data = Data;
T->Left->Left = T->Left->Right = NULL;
AddQ(Q, T->Left);
}
scanf_s("%d", &Data);
if (Data == 0) {
T->Right = NULL;
}
else {
T->Right = (BinTree)malloc(sizeof(struct TNode));
T->Right->Data = Data;
T->Right->Left = T->Right->Right = NULL;
AddQ(Q, T->Right);
}
}
return BT;
}
创建过程