二叉树相关

安稳与你 提交于 2020-02-12 18:14:42

镜面反转:是指将所有非叶结点的左右孩子对换。

 

1.已知先序遍历,中序遍历,求层序遍历(这道题求层序的镜面反转,所以每一层从右向左遍历)

  

 

#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
const int N = 10110;
int pre[N],mid[N];  //前序遍历 中序遍历结果
int n,cnt;
queue<int> q;
struct Node {
	int w;
	int l,r;
}node[N];
void bulid(int l,int r,int pos) {
	if(l>=r) {
		node[pos].w = -1;
		return; 
	}
	int root = pre[cnt++];
	node[pos].w = root;
	node[pos].l = 2*pos;//左子结点
	node[pos].r = 2*pos+1;//右子结点
	int m =  find(mid,mid+r,root)-mid;	//algorithm中的find()函数,返回指针
	bulid(l,m,2*pos);
	bulid(m+1,r,2*pos+1);   
}
void LevelPrint() {
	q.push(1);
	int pos;
	while(!q.empty()) {
		pos=q.front();
		q.pop();
		if(node[pos].w!=-1) {
			if(pos!=1)	cout<<" ";
			cout<<node[pos].w;
			q.push(node[pos].r);
			q.push(node[pos].l);	
		}
	}
	cout << endl;
}
int main() {
	cin >> n;
	for(int i=0;i<N;i++)
		node[i].w=-1;	//每一个结点先初始化为叶子结点 
	for(int i=0;i<n;i++)
		cin >> mid[i];
	for(int i=0;i<n;i++)
		cin >> pre[i];
	bulid(0,n,1);
	LevelPrint();
	return 0;
}

 

2.已知后序遍历和中序遍历,输出其层序遍历的序列。

#include<iostream>
#include<queue>
using namespace std;
int tree[10010],level[10010];    //tree:二叉树   level:记录层序遍历
int sum;
int lvr[31],lrv[31];
//构建二叉树 
void CreateTree(int *lrv,int *lvr,int n,int index) {
	if(n==0)
		return;
	int k=0;
	while(lrv[n-1]!=lvr[k])	k++;
	tree[index] = lvr[k];
	CreateTree(lrv,lvr,k,index*2);
	CreateTree(lrv+k,lvr+k+1,n-k-1,index*2+1);
}
//层序遍历 
void LevelPrint() {
	queue<int> q;
	q.push(1);
	int p;
	while(!q.empty()) {
		p = q.front();
		q.pop();
		level[sum++] = tree[p];
		if(tree[p*2]!=0)	q.push(p*2);
		if(tree[p*2+1]!=0)	q.push(p*2+1);
	}
}
int main() {
	int n;
	cin >> n;
	for(int i=0;i<n;i++)
		cin >> lrv[i];
	for(int i=0;i<n;i++)
		cin >> lvr[i];
	CreateTree(lrv,lvr,n,1);
	LevelPrint();
	for(int i=0;i<sum;i++) {
		if(i==sum-1)
			cout<<level[i]<<endl;
		else
			cout<<level[i]<<" ";
	}
	return 0;
}

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!