二叉树建立(先序)

本文介绍如何通过先序、中序或后序输入序列构建二叉树,并实现先序、中序、后序及层序遍历。使用递归方法创建节点,并通过STL队列实现层序遍历。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

建立二叉树

建立二叉树可根据输入一个串先序、中序或后序建立,如本篇中以1 2 4 -1 -1 -1 3 5 -1 -1 -1为例,数字-1为空结点,先序、中序、后序没什么太大区别,仅仅时对结点数据赋值的时间不同,建立运用递归思想。遍历可先、中、后序,也可层序遍历。层序遍历可以运用队列,每pop出一个数据,push进相应的左右孩子。本篇中我队列用的stl模板,队列中存放每个结点指针,个人觉得这样更简单也更方便理解。

创建结点

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<queue>
using namespace std;//1 2 4 -1 -1 -1 3 5 -1 -1 -1
int cout=0;
typedef struct node{
	int data;
	struct node *leftchild;
	struct node *rightchild;
}Tree,*Btree;

先序建立二叉树

int createtree(node* &root)//先序创建二叉树,设置当输入数字为-1时为空结点  
{
	int x;
	scanf("%d",&x);
	if(x==-1){
		root=NULL;
	}
	else{
		root=(node*)malloc(sizeof(node));
		root->data=x;cout++;
		createtree(root->leftchild);
		createtree(root->rightchild);//cout++;
	}
return cout;//设置全局变量cout记录新创结点数 
}

遍历:

void firstfind(node* &root)//先序遍历 
{
	if(root)
	{
		printf("%4d",root->data);
		firstfind(root->leftchild);
		firstfind(root->rightchild); 
	}
}
void middlefind(node* &root)//中序遍历 
{
	if(root)
	{
		
		middlefind(root->leftchild);printf("%4d",root->data);
		middlefind(root->rightchild); 
	}
}
void lastfind(node* &root)//后序遍历 
{
	if(root)
	{
		
		lastfind(root->leftchild);
		lastfind(root->rightchild); printf("%4d",root->data);
	}
}
void everyfind(node* &root)//层序遍历(stl模板建立指针队列,每一个指针入队时,当左右孩子存在,压其入队) 
{
	queue<node*>q;
	q.push(root);
	while(!q.empty())
	{
		printf("%4d",q.front()->data);
		if(q.front()->leftchild)q.push(q.front()->leftchild);
		if(q.front()->rightchild)q.push(q.front()->rightchild);
		q.pop();//pop掉队首指针 
	}
}

主函数:

int main()
{

	Btree root; 
	createtree(root);
	printf("先序遍历:\n");
	firstfind(root); 
	printf("\n");
	printf("中序遍历:\n");
	middlefind(root); 
	printf("\n");
	printf("后序遍历:\n");
	lastfind(root);
	printf("\n");
	printf("层序遍历:\n");
	everyfind(root);
	printf("\n");
		printf("建立了%d个节点\n",cout);
return 0;
 } 

注意:每次传进去的root要取地址&而非*,传地址可以直接改变指针相应数据,因为这个小问题费了好多不必要的时间检查,好坑啊~~

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值