已知先序中序构树

#include <cstdio>
#include <iostream>
using namespace std;
const int N = 50;
int pre[N], in[N], post[N];        //存放先序,中序,后序的数组 
int n;//树中元素个数
struct node {
	int data;//数据
	node* lchild;//左子数指针
	node* rchild;//右子树指针
};
node* create(int prel, int prer, int inl, int inr)  //根据先序和中序建立树 
{           //4个参数  先序的左右边界,中序的左右边界  
	if (prel>prer)                              //已经遍历完了,返回 
	{
		return NULL;//返回空指针
	}
	node* root = new node;                      //建立一个根结点,用来存放当前的树结点
	root->data = pre[prel];                     // 因为是已知先序,所以当前树的值,一定等于先序的最左边的点 
	int k;                                    //记录当前根节点在中序的下标
	for (k = inl; k <= inr; k++)
	{
		if (in[k] == pre[prel])                 //找到位置,跳出,k不再++
			break;
	}
	int numleft = k - inl;                        //当前树的左子树的数量
	root->lchild = create(prel + 1, prel + numleft, inl, k - 1);     //将这部分存入左子树 
	root->rchild = create(prel + numleft + 1, prer, k + 1, inr);     // 将这部分存入右子树
	return root;                //返回根结点的地址,将整个树的结点连接起来
}

已知后序中序构树

#include <cstdio>
#include <iostream>
#include <queue>
using namespace std;
const int N = 50;
int pre[N], in[N], post[N];//in中序,post后序
int n;//结点个数
struct Node {
	int data;//数据
	Node* lchild;//左子树指针
	Node* rchild;//右子树指针
};
Node* create(int postl, int postr, int inl, int inr)//4个参数  后序的左右边界,中序的左右边界  
{
	if (postl>postr) //已经遍历完了,返回 
	{
		return NULL;
	}
	Node* root = new Node; //建立一个根结点,用来存放当前的树结点
	root->data = post[postr];  // 因为是已知后序,所以当前树的值,一定等于先序的最右边
	int k;
	for (k = inl; k<=inr; k++)
	{
		if (in[k] == post[postr]) //找到位置,跳出,k不再++  
			break;
	}
	int numleft = k - inl;//当前树的左子树的数量  
	root->lchild = create(postl, postl + numleft - 1, inl, k - 1);//将这部分存入左子树   
	root->rchild = create(postl + numleft, postr - 1, k + 1, inr);// 将这部分存入右子树  
	return root; //返回根结点的地址,将整个树的结点连接起来 
}

先序中序后序输出

void printfpost(node* root)               
{
	if (root == NULL)return;//遇到空指针返回
 
	printfpost(root->lchild);
	printfpost(root->rchild);
 
	printf("%d", root->data);//这三行放后面为后序,前面先序,中间中序输出
	num++;
	if (num<n) printf(" ");
}

层次遍历输出

void bfs(Node* root)        //层次遍历输出 
{
	queue<Node*> q;
	int num = 0;
	q.push(root);//根结点入队
	while (!q.empty())
	{
		Node* now = q.front();
		q.pop();
		printf("%d", now->data);//输出此结点数据
		num++;
		if (num<n) printf(" ");
		if (now->lchild != NULL) q.push(now->lchild);//左右结点依次入队
		if (now->rchild != NULL) q.push(now->rchild);
	}
	putchar(10);//换行
}

树高度的求法

int gethight(node *root) {
	if (!root)return 0;
	return max(gethight(root->lchild) + 1, gethight(root->rchild) + 1);
}

主函数

int main()
{
	scanf("%d", &n);
	for (int i = 0; i<n; i++)//输入先序排列
	{
		scanf("%d", &pre[i]);//后序scanf("%d", &post[i]);
	}
	for (int i = 0; i<n; i++)//输入中序排列
	{
		scanf("%d", &in[i]);
	}
	node* root = create(0, n - 1, 0, n - 1);//构树,4个参数  先后序的左右边界,中序的左右边界  
	调用输出函数;
}