利用树的层序遍历创建一颗二叉链表树

创建任意一颗二叉链表树,在输入序列中标明每一个树结点及其两个孩子结点,若孩子结点为空,需要用特殊值标记。

如,若要构造图中的二叉树,需要将所有结点的空指针域标识出来。

因而输入序列:1 2 3 -1 4 5 6 7 8 9 -1 10 11 12 -1 13 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 9999

其中-1对应图中的空结点‘#’,9999表示输入序列结束。

 

核心代码如下:

//创建一个树节点,返回值表示是否创建完成
bool CreateTreeNode(TNode*& p)
{
	int x;
	scanf("%d", &x);
	if (x >= 9999)//输入值大于等于9999,二叉树创建结束
		return false;

	if (x >= 0)//在输入序列中,-1表示空结点
	{
		p = (TNode*)malloc(sizeof(TNode));
		p->data = x;
	}
	else
		p = NULL;
	return true;
}
void CreateTree(BTree& tree)
{
	if (!CreateTreeNode(tree))
	{
		tree = NULL;
		return;
	}

	//树的层序遍历
	Queue queue;
	InitQueue(queue);
	EnQueue(queue, tree);
	TNode* p; void* vp;
	while (!IsEmptyQueue(queue))
	{
		DeQueue(queue, vp);
		p = (TNode*)vp;

		if (!CreateTreeNode(p->left))return;
		if (!CreateTreeNode(p->right))return;

		if (p->left != NULL)
			EnQueue(queue, p->left);
		if (p->right != NULL)
			EnQueue(queue, p->right);
	}
}

 

树结点定义和队列定义及其操作如下:

//树结点定义
typedef struct TreeNode
{
	int data;
	struct TreeNode* left, *right;
}TNode,*BTree;


//队列定义及其操作

typedef struct QueueNode
{
	void* data;
	struct QueueNode* next;
}QNode;

typedef struct LinkQueue
{
	QNode* front, * rear;
}Queue;

void InitQueue(Queue& Q)
{
	Q.front = Q.rear = (QNode*)malloc(sizeof(QNode));
	Q.front->next = NULL;
}

void EnQueue(Queue& Q, void* x)
{
	QNode* s = (QNode*)malloc(sizeof(QNode));
	s->data = x;
	s->next = NULL;

	Q.rear->next = s;
	Q.rear = s;
}

bool IsEmptyQueue(Queue Q)
{
	return Q.front == Q.rear;
}

bool DeQueue(Queue& Q, void*& x)
{
	if (IsEmptyQueue(Q))return false;

	QNode* p = Q.front->next;
	Q.front->next = p->next;

	if (p == Q.rear)
		Q.rear = Q.front;

	x = p->data;
	free(p);

	return true;
}

函数调用如下:

void PreOrder(BTree T)
{
	if (T != NULL)
	{
		printf("%d ", T->data);
		PreOrder(T->left);
		PreOrder(T->right);
	}
}
void InOrder(BTree T)
{
	if (T != NULL)
	{
		InOrder(T->left);
		printf("%d ", T->data);
		InOrder(T->right);
	}
}


int main()
{
	BTree tree;
	CreateTree(tree);

    //用先序+中序测试所创建的树是否符合要求
	PreOrder(tree);
	printf("\n");
	InOrder(tree);

	return 0;
}

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值