二叉树的创建(先序创建,先序中序创建,中序后序创建)

本文介绍了三种创建二叉树的方法:根据先序创建、先序中序创建以及中序后序创建。详细讲解了每种方法的思路,并给出了相应的代码实现,包括二叉树节点的定义、内存管理和递归创建过程。

二叉树的创建

我们这里使用三种方法创建二叉树:

  1. 根据先序创建二叉树
  2. 根据先序中序创建二叉树
  3. 根据中序后序创建二叉树

①:二叉树的节点定义:

 

②:购买二叉树节点内存

 

③:释放二叉树节点内存

 

 

一:根据先序创建二叉树

思路:

  1. 申请节点并将当前元素赋值
  2. 递归创建其左子树,参数传字符串下一个元素地址
  3. 递归创建其右子树,参数传字符串下下一个元素地址

特别注意:这里传入的字符串指针是引用类型,要让其动起来,要不递归的时候++,将不会有任何作用

代码如下:

//按顺序一个一个加载进树里
BtNode *CreateTree(ELEMTYPE * &ptr) //这块传指针的引用 是因为要让数组一直++下去,要不然值传递,导致只能在前几个循环
{
	BtNode *pnewnode = NULL;
	if(ptr!=NULL && *ptr!=END)
	{
		pnewnode = BuyNode();
		pnewnode->data = *ptr;
		pnewnode->leftchild = CreateTree(++ptr);
		pnewnode->rightchild = CreateTree(++ptr);
	}
	return pnewnode;
}

 

二:根据先序中序创建二叉树

思路:

  1. 我们知道先序序列的第一个节点为根节点
  2. 通过FindPos函数找到传入根节点的值找到在中序序列中对应的位置pos
  3. 再根据这个位置pos,递归创建左子树和右子树

代码如下:

//前中序创建二叉树
//1.FindPos找到节点所在位置  将左右递归进去
int FindPos(ELEMTYPE *in, ELEMTYPE val, int n)
{
	if(NULL == in) return -1;
	int pos = -1;
	for(int i=0; i<n; i++)
	{
		if(in[i] == val)
		{
			pos = i;
		}
	}
	return pos;
}

BtNode* PreInCreate(ELEMTYPE *pre, ELEMTYPE *in, int n)
{
	BtNode *pnewnode = NULL;
	if(n > 0)
	{
		pnewnode = BuyNode();
		pnewnode->data = pre[0];
		int pos = FindPos(in, pnewnode->data, n);
		if(pos == -1) exit(1);
		pnewnode->leftchild = PreInCreate(pre+1, in, pos);
		pnewnode->rightchild = PreInCreate(pre+pos+1, in+pos+1, n-pos-1);
	}
	return pnewnode;
}

BtNode* CreatePI(ELEMTYPE *pre, ELEMTYPE *in, int n)
{
	if(NULL == pre || NULL == in || n < 1)
	{
		return NULL;
	}
	return PreInCreate(pre, in, n);
}

 

三:根据中序后序创建二叉树

思路:

  1. 我们知道后序序列的最后一个节点为根节点
  2. 通过FindPos函数找到传入根节点的值找到在中序序列中对应的位置pos
  3. 再根据这个位置pos,递归创建左子树和右子树

代码如下:

//中后序创建二叉树
BtNode *InLastCreate(ELEMTYPE *in, ELEMTYPE *last, int n)
{
	BtNode *pnewnode = NULL;
	if(n > 0)
	{
		pnewnode = BuyNode();
		pnewnode->data = last[n-1];
		int pos = FindPos(in, pnewnode->data, n);
		if(n == -1) exit(1);
		pnewnode->leftchild = InLastCreate(in, last, pos);
		pnewnode->rightchild = InLastCreate(in+pos+1, last+pos, n-pos-1);
	}
	return pnewnode;
}

BtNode* CreateIL(ELEMTYPE *in, ELEMTYPE *last, int n)
{
	if(NULL == in || NULL == last || n < 1)
	{
		return NULL;
	}
	return InLastCreate(in, last, n);
}

 

评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值