【数据结构】17 二叉树的建立

二叉树的建立

由于树是非线性结构,创建一颗二叉树必须首先确定树中结点的输入顺序,常用方法是先序创建和层序创建。

层序创建所用的节点输入序列是按数的从上至下从左到右的顺序形成的各层的空结点输入数值0。在构造二叉树过程中需要一个队列暂时存储各节点的地址,其创建过程如下:

  1. 输入第一个数据
    · 若为0,表示此树为空,将空指针赋给根指针,树构造完毕
    · 若不为0,动态分配一个结点单元,并存入数据,同时将该结点地址放入队列。
  2. 若队列不为空,从队列中取出一个结点地址,并建立该节点的左右孩子。
    · 从输入序列中读入下一个数据
    若读入的数据为零,将出队节点的左孩子指针置空,否则分配一个节点单元存入所读数值,并将其作为出对节点的左孩子,同时将此孩子的地址入队
    · 接着再从输入序列中读入下一个数据
    若读入的数据为零,将出队节点的右孩子指针置空,否则分配一个节点单元存入所读数值,并将其作为出对节点的右孩子,同时将此孩子的地址入队
  3. 重复第二步过程,直到队列为空,再无节点出队。

代码实现层序创建二叉树

c 复制代码
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;

}

创建过程

相关推荐
学逆向的7 小时前
C 循环结构的执行效率分析
c语言·开发语言·数据结构·网络安全
jeo陽11 小时前
04-循环实战:素数、最大公约数、级数求和与枚举法
c语言·开发语言·数据结构
slandarer13 小时前
MATLAB | 趣味编程——动态字符串甜甜圈和爱心
数据结构·matlab·趣味编程
UIU11413 小时前
P1003 [NOIP 2011 提高组] 铺地毯
数据结构·c++·算法
爱读书的小胖13 小时前
LeetCode 88. 合并两个有序数组 C 解题分析
c语言·数据结构·算法
inrichtt14 小时前
第七课时:STM32时钟系统揭秘:从零理解时钟树
c语言·数据结构·stm32·单片机·嵌入式硬件
xxwl58514 小时前
区域赛算法模版第四章---数据结构
数据结构·c++·算法
Logic10116 小时前
C语言/数据结构二维数组题解:找出行列O个数均为偶数的格子——奇偶性预处理+二次遍历
c语言·数据结构·算法·二维数组·时间复杂度·动态内存分配·奇偶性
垆边人似月.17 小时前
移动长度 k 子串使字符串变成回文
数据结构·算法
David猪大卫17 小时前
【C++修炼】string类:string类的模拟实现
c语言·开发语言·数据结构·c++·经验分享·笔记·学习