创建过程:
(1) 输入第一个数据:
若为0,表示此树为空,将空指针赋给根指针,树构造完毕;
若不为0,动态分配一个节点单元,并存入数据,同时将该节点地址放入队列。
(2) 若节点不为空,从队列中取出一个节点地址,并建立该节点的左右孩子:
从输入序列中读入下一数据;
若读入的数据为0,将出队节点的左孩子指针置空;否则,分配一个新的节点单元,存入所读值,并将其置为出队节点的左孩子,同时将此孩子地址入队;
接着再从输入序列中读入下一个数据;
若读入的数据为0,将出队节点的右孩子指针置空;否则,分配一个新的节点单元,存入所读值,并将其置为出队节点的右孩子,同时将此孩子地址入队;
(3) 重复第(2)步过程,直到队列为空,再无节点出队,构造过程到此结束。
typedef int ElementType; #define NoInfo 0 //用0表示没有节点 //层序创建二叉树 BinTree CreateBinTree() { ElementType Data; BinTree BT, T; queue<TNode *> Q; //创建第1个节点,即根节点 cin >> Data; if(Data != NoInfo) { //分配节点单元,并将节点地址入队 BT = (BinTree)malloc(sizeof(struct TNode)); BT->Data = Data; BT->Left = BT->Right = NULL; Q.push(BT); } else return NULL; //若第一个数据就是0,返回空树 while(!Q.empty()) { T = Q.front(); //从队列中取出一节点地址 Q.pop(); cin >> Data; //读入T的左孩子 if(Data == NoInfo) T->Left = NULL; else { //分配新节点,作为出队节点的左孩子,并将该新节点入队 T->Left = (BinTree)malloc(sizeof(struct TNode)); T->Left->Data = Data; T->Left->Left = T->Left->Right = NULL; Q.push(T->Left); } cin >> Data; //读入T的右孩子 if(Data == NoInfo) T->Right = NULL; else { //分配新节点,作为出队节点的右孩子,并将该新节点入队 T->Right = (BinTree)malloc(sizeof(struct TNode)); T->Right->Data = Data; T->Right->Left = T->Right->Right = NULL; Q.push(T->Right); } } //结束while return BT; //返回二叉树的根节点 }