C/C++层序遍历建树

一、前置知识

要会函数,结构体,指针,队列等C语言基础

二、实现功能

1、输入想要创建树的结点数

2、用层序遍历(广搜)建一个二叉树

3、用前序遍历,中序遍历,后序遍历访问这颗树是否正确

4、释放树的所有内存,并让指针指向空

5、查看是否成功

三、10个结点建的树的图

四、代码运行效果

五、全部代码

#include<stdio.h>
#include<stdlib.h>
#include<queue>
using namespace std;

typedef struct Node
{
	int data;//整形数据 
	struct Node * left;//左节点 
	struct Node * right;//右节点 
}node, *pNode;//一个结点数据类型,一个结点指针数据类型 
queue<pNode> q;//结点地址队列 

void init(pNode pNd, int order);//初始化函数(层序遍历) ,order表示1到order的结点 
void preOrder(pNode pNd);//前序遍历 
void inOrder(pNode pNd);//中序遍历 
void postOrder(pNode pNd);//后序遍历 
void myDelete(pNode pNd);//释放树的所有空间 (后序遍历释放)
void myFree(pNode *ppNd);//调用myDelete,并让指针指向空 

int main()
{
	pNode pNd = (pNode)malloc(sizeof(node));
	int k;//结点数 
	printf("请输入结点数:");
	scanf("%d", &k);
	init(pNd, k);
	printf("前序遍历:");
	preOrder(pNd);
	printf("\n");
	
	printf("中序遍历:"); 
	inOrder(pNd);
	printf("\n");
	
	printf("后序遍历:"); 
	postOrder(pNd);
	printf("\n");
	
	myFree(&pNd);
	printf("pNd = %p\n", pNd);
	return 0;
}

//调用myDelete,并让根节点指向空 
void myFree(pNode *ppNd)
{
	myDelete(*ppNd);
	(*ppNd) = NULL;
}

//释放树的所有空间 (后序遍历释放)
void myDelete(pNode pNd)
{
	if(!pNd) return;
	
	myDelete(pNd->left);
	myDelete(pNd->right);
	printf("%d结点释放...\n", pNd->data);
	free(pNd);
}

//后序遍历 
void postOrder(pNode pNd)
{
	if(!pNd) return;
	
	postOrder(pNd->left);
	postOrder(pNd->right);
	printf("%d ", pNd->data);
}

//中序遍历 
void inOrder(pNode pNd)
{
	if(!pNd) return;
	
	inOrder(pNd->left);
	printf("%d ", pNd->data);
	inOrder(pNd->right);
}

//前序遍历 
void preOrder(pNode pNd)
{
	if(!pNd) return;
	
	printf("%d ", pNd->data);
	preOrder(pNd->left);
	preOrder(pNd->right);
}

//初始化函数(层序遍历) ,order表示1到order的结点 
void init(pNode pNd, int order)
{
	if(!pNd || order <= 0) return;
	
	int i = 0;
	pNd->data = ++i;
	pNd->left = NULL;
	pNd->right = NULL;
	q.push(pNd);
	pNode tP = NULL;
	
	while(i < order)
	{
		tP = q.front();
		q.pop();
		
		tP->left = (pNode)malloc(sizeof(node));
		tP->left->data = ++i;
		tP->left->left = NULL;
		tP->left->right = NULL;
		q.push(tP->left);
		
		if(i >= order) break;
		
		tP->right = (pNode)malloc(sizeof(node));
		tP->right->data = ++i;
		tP->right->left = NULL;
		tP->right->right = NULL;
		q.push(tP->right);
	}
	
	tP = NULL;
	while(!q.empty()) q.pop();
}

根据提供的引用内容,可以通过层序遍历的方式来建立二叉树。具体的实现过程如下: 首先,需要定义一个二叉树的数据结构和一个队列的数据结构。二叉树的定义可以包括节点的数据和左右子节点的指针。队列可以使用数组或链表实现,用来存储节点指针。 接下来,可以借助一个辅助队列来进行层序遍历建树。首先,将二叉树的根节点入队。然后,循环执行以下操作:出队一个节点,访问该节点;如果该节点有左子树,则将左子树的根节点入队;如果该节点有右子树,则将右子树的根节点入队。直到队列为空时,建树的过程结束。 下面是一个示例的实现过程: ```c++ #include <iostream> #include <queue> using namespace std; struct Node { int data; Node* left; Node* right; }; Node* createNode(int data) { Node* newNode = new Node(); if (!newNode) { cout << "Memory error\n"; return NULL; } newNode->data = data; newNode->left = newNode->right = NULL; return newNode; } Node* insertNode(Node* root, int data) { // If the tree is empty, assign a new node address to the root if (root == NULL) { root = createNode(data); return root; } // Else, do level order traversal until we find an empty // position, i.e. either left child or right child of some // node is pointing to NULL. queue<Node*> q; q.push(root); while (!q.empty()) { Node* temp = q.front(); q.pop(); if (temp->left != NULL) q.push(temp->left); else { temp->left = createNode(data); return root; } if (temp->right != NULL) q.push(temp->right); else { temp->right = createNode(data); return root; } } return root; } void levelOrderTraversal(Node* root) { if (root == NULL) return; queue<Node*> q; q.push(root); while (!q.empty()) { Node* temp = q.front(); q.pop(); cout << temp->data << " "; if (temp->left != NULL) q.push(temp->left); if (temp->right != NULL) q.push(temp->right); } } int main() { Node* root = NULL; int data; // Insert nodes in level order root = insertNode(root, 1); root = insertNode(root, 2); root = insertNode(root, 3); root = insertNode(root, 4); root = insertNode(root, 5); // Level order traversal of the tree cout << "Level Order Traversal: "; levelOrderTraversal(root); return 0; } ``` 这段代码实现了二叉树的层序遍历建树过程,并对建立好的二叉树进行层序遍历输出。你可以根据自己的需求进行修改和扩展。希望对你有帮助!<span class="em">1</span><span class="em">2</span> #### 引用[.reference_title] - *1* *2* [二叉树的层序遍历c++)](https://blog.csdn.net/qq_45519325/article/details/129207375)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

� � � � �586

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值