已知二叉树前序中序,构造一课二叉树

#include<iostream>
#include<queue>
using namespace std;

struct Btnode {
	struct Btnode *left;
	struct Btnode *right;
	int value;
};

typedef struct Btnode *BTree;
int index = -1;

int pre[] = { 1, 2, 4, 8, 9, 5, 10, 11, 3, 6, 12, 13, 7, 14, 15 };
int in[] = { 8, 4, 9, 2, 10, 5, 11, 1, 12, 6, 13, 3, 14, 7, 15 };

//由前序与中序序列,一样可以构造出一棵二叉树的。

//参数解释
/*
 BTree &T:因为要对二叉树进行写入数据,对二叉树有实际的物理改动,因此一定要加&,表示引用
 root:表示前序序列的起始下标
 start:表示中序序列的起始下标
 end:表示中序序列的结束下标
*/
void post(BTree &T,int root,int start,int end)
{
	if (start > end)
	{
		T = NULL;//说明左子树为空或者右子树为空
		return;//结束递归
	}

	index++;
	T= (BTree)malloc(sizeof(Btnode));

	int i = start;
	while (i < end&&in[i]!=pre[root])i++;//查找前序序列的节点在中序序列中的位置
	                                     //将中序序列分为左子树和右子树,进行递归。

	T->value = pre[index];//直接将前序序列的值赋值给构造的二叉树
	                      //因为二叉树的构造是从根节点开始构造,所以只能从前序序列中取值
	                      //然后为其赋值(个人观点,因为目前还没有尝试过有没有其他的方法解决这个问题(^_^)(^_^))

	//cout << T->value << " ";
	post(T->left,root+1,start,i-1);//对左子树进行递归
	post(T->right,root+1+i-start, i + 1, end);//对右子树进行递归
	//cout<<in[i]<<" "; 此处输出可以得到后序遍历的结果。
}

//层序输出
void level(BTree t)
{
	queue<BTree> que;
	if (t)
	{
		BTree q;
		que.push(t);
		while (!que.empty())
		{
			q = que.front();
			que.pop();
			cout << q->value << " ";
			if (q->left != NULL)
			{
				que.push(q->left);
			}
			if (q->right != NULL)
			{
				que.push(q->right);
			}
		}
	}
}

//交互左右子树
void binary_change(BTree T)
{
	if (T)
	{
		BTree temp;
		temp = T->left;
		T->left = T->right;
		T->right = temp;
		binary_change(T->left);
		binary_change(T->right);
	}
}

int main()
{
	BTree t;

	post(t,0, 0, 14);
	cout << endl;

	cout << "层序输出" << endl;
	level(t);
	cout << endl;

	cout << "交换二叉树左右节点" << endl;
	binary_change(t);
	level(t);
	cout << endl;
	system("pause");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值