二叉树的层次建立方式(C语言)

二叉树的层次建立方式(C语言)

二叉树的层次建立方式与先序、中序、后序建树的方式有较大区别。类似于深搜用递归、广搜用队列。

输入一组整数,0代表结点不存在,-1代表输入结束
有很多C++版本了,所以在这里完全用C语言实现

#include <stdio.h>
#include <stdlib.h>
typedef struct node{
    int data;
    struct node *lchild, *rchild;
}BinTree;
BinTree *que[1000];
int s[1000],ss = 0;
int front = 0, rear = 0;
int num;
BinTree* CreateBiTree(void)
{
    int n = num;
    int d,d1,d2;
    BinTree *t, *bt, *q;
    d = s[ss++];
    if(d != 0 && d != -1){
        bt = (BinTree*)malloc(sizeof(BinTree));
        bt->data = d;
        bt->rchild = bt->lchild = NULL;
        que[rear++] = bt;
        n--;
    }
    else
        return NULL;
    while(n){
        t = que[front];
        front++;
        if(n == 0)
            break;
        d1 = s[ss++];
        if(d1 == -1)
            break;
        if(d1 != 0){
            q = (BinTree*)malloc(sizeof(BinTree));
            q->data = d1;
            t->lchild = q;
            q->rchild = q->lchild = NULL;
            que[rear++] = q;
            n--;
        }
        else
            t->lchild = NULL;
        d2 = s[ss++];
        if(d2 == -1)
            break;
        if(d2 != 0){
            q = (BinTree*)malloc(sizeof(BinTree));
            q->data = d2;
            t->rchild = q;
            q->rchild = q->lchild = NULL;
            que[rear++] = q;
            n--;
        }
        else
            t->rchild = NULL;
    }
    return bt;
}
void PrintBTree(BinTree *bt)
{
    if(bt != NULL){
        printf("%d ", bt->data);
        PrintBTree(bt->lchild);
        PrintBTree(bt->rchild);
    }
}
int main(void)
{
    BinTree *root;
    int n, i, j, k;
    num = 0, ss = 0;
    front = rear = 0;
    while(1){
        scanf("%d", &s[num]);
        if(s[num] == -1)
            break;
        num++;
    }
    root = CreateBiTree();
    PrintBTree(root);
    printf("\n");
    return 0;
}

初步添加注释版

bitree* CreateTree(){
	char ch;	//结点信息变量
	bitree *Q[MAXSIZE];	//设置指针类型数组来构成队列
	int front, rear;	//队头和队尾指针变量
	bitree *root, *s;	//根节点指针和中间指针变量
	root = NULL;	//二叉树置空
	front = 1, rear = 0;	//设置队列指针变量初值
	while((ch=getchar()) != '#'){
		//输入一个字符,当不是结束符时执行以下操作
		s = NULL;
		if(ch != '@'){
			s = (bitree*)malloc(sizeof(bitree));
			s->data = ch;
			s->lchild = NULL;
			s->rchild = NULL;
		}
		rear++;	//队尾指针增1,指向新结点地址存放的单元
		Q[rear] = s;
		if(rear == 1)
			root = s;
		else{
			if(s && Q[front]){
				if(rear%2 == 0)
					//rear为偶数,新结点是左孩子
					Q[front]->lchild = s;
				else
					//rear为奇数,新结点是右孩子
					Q[front]->rchild = s;
			}
			if(rear%2 == 1)
				//结点*Q[front]的两个孩子处理完毕,出队
				front++;
		}
	}
	return root;
}
  • 12
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
C语言中,我们可以使用队列按层次遍历建立二叉树。 具体实现步骤如下: 1. 定义二叉树节点结构体: ```c typedef struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; } TreeNode; ``` 2. 定义队列结构体: ```c typedef struct QueueNode { TreeNode *treenode; struct QueueNode *next; } QueueNode; typedef struct Queue { QueueNode *front; QueueNode *rear; } Queue; ``` 3. 实现队列的入队、出队、判空操作: ```c void enqueue(Queue *q, TreeNode *treenode) { QueueNode *node = (QueueNode *)malloc(sizeof(QueueNode)); node->treenode = treenode; node->next = NULL; if (q->front == NULL) { q->front = node; } else { q->rear->next = node; } q->rear = node; } TreeNode *dequeue(Queue *q) { if (q->front == NULL) { return NULL; } TreeNode *treenode = q->front->treenode; QueueNode *temp = q->front; q->front = q->front->next; free(temp); return treenode; } bool isEmpty(Queue *q) { return q->front == NULL; } ``` 4. 实现按层次遍历建立二叉树的函数: ```c TreeNode *createBinaryTreeByLevelOrder(void) { Queue *q = (Queue *)malloc(sizeof(Queue)); q->front = q->rear = NULL; TreeNode *root = NULL; int val; printf("请输入根节点的值:"); scanf("%d", &val); if (val == -1) { return NULL; } root = (TreeNode *)malloc(sizeof(TreeNode)); root->val = val; root->left = root->right = NULL; enqueue(q, root); while (!isEmpty(q)) { TreeNode *parent = dequeue(q); printf("请输入%d节点的左子节点的值:", parent->val); scanf("%d", &val); if (val != -1) { TreeNode *left = (TreeNode *)malloc(sizeof(TreeNode)); left->val = val; left->left = left->right = NULL; parent->left = left; enqueue(q, left); } printf("请输入%d节点的右子节点的值:", parent->val); scanf("%d", &val); if (val != -1) { TreeNode *right = (TreeNode *)malloc(sizeof(TreeNode)); right->val = val; right->left = right->right = NULL; parent->right = right; enqueue(q, right); } } return root; } ``` 完整代码如下:

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值