层序创建二叉树

创建过程:

(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;    //返回二叉树的根节点
}

 

转载于:https://www.cnblogs.com/FengZeng666/p/9729818.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是C语言层序创建二叉树的示例代码: ```c #include <stdio.h> #include <stdlib.h> #define MAX_SIZE 100 /* 节点结构 */ typedef struct node { char a; struct node* leftchild, * rightchild; } Bitree; /* 队列结构 */ typedef struct queue { Bitree* data[MAX_SIZE]; int front, rear; } Queue; /* 初始化队列 */ void initQueue(Queue* q) { q->front = q->rear = 0; } /* 判断队列是否为空 */ int isEmpty(Queue* q) { return q->front == q->rear; } /* 入队 */ void enQueue(Queue* q, Bitree* node) { if ((q->rear + 1) % MAX_SIZE == q->front) { printf("Queue is full.\n"); return; } q->data[q->rear] = node; q->rear = (q->rear + 1) % MAX_SIZE; } /* 出队 */ Bitree* deQueue(Queue* q) { if (isEmpty(q)) { printf("Queue is empty.\n"); return NULL; } Bitree* res = q->data[q->front]; q->front = (q->front + 1) % MAX_SIZE; return res; } /* 层序创建二叉树 */ void create(Bitree** T) { Queue q; initQueue(&q); char a; scanf("%c", &a); if (a == '#') { *T = NULL; return; } *T = (Bitree*)malloc(sizeof(Bitree)); (*T)->a = a; (*T)->leftchild = (*T)->rightchild = NULL; enQueue(&q, *T); while (!isEmpty(&q)) { Bitree* node = deQueue(&q); scanf("%c", &a); if (a == '#') { node->leftchild = NULL; } else { node->leftchild = (Bitree*)malloc(sizeof(Bitree)); node->leftchild->a = a; node->leftchild->leftchild = node->leftchild->rightchild = NULL; enQueue(&q, node->leftchild); } scanf("%c", &a); if (a == '#') { node->rightchild = NULL; } else { node->rightchild = (Bitree*)malloc(sizeof(Bitree)); node->rightchild->a = a; node->rightchild->leftchild = node->rightchild->rightchild = NULL; enQueue(&q, node->rightchild); } } } /* 先序遍历 */ void preOrder(Bitree* T) { if (T == NULL) { return; } printf("%c ", T->a); preOrder(T->leftchild); preOrder(T->rightchild); } int main() { Bitree* T; create(&T); printf("先序遍历结果:"); preOrder(T); printf("\n"); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值