栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

L2-011 玩转二叉树

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

L2-011 玩转二叉树

题目链接
相似题目
L2-006 树的遍历

步骤:
1、根据前序遍历和中序遍历建立二叉树
2、递归翻转左右子树
3、使用队列的先进先出性质实现层次遍历(广度优先)

#include
#include
#include
#include
using namespace std;
int A[35];
int B[35];
int N;
typedef struct TNode {
	struct TNode* left;
	struct TNode* right;
	int data;
}*Tree;
Tree BuildTree(int X[],int Y[],int n) {		//建立二叉树
	if (n <= 0  )	return NULL;
	int i = 0;
	while (X[i] != Y[0])i++;
	//cout << n << endl;
	Tree p = (Tree)malloc(sizeof(struct TNode));
	p->data = X[i];
	//cout << "left" << endl;
	p->left = BuildTree(X, &Y[1], i);
	//cout << "right" << endl;
	p->right = BuildTree(&X [ i + 1], &Y [ i + 1], n - i - 1);
	
	return p;
}
void Reverse(Tree& T) {			//翻转左右子树
	if (T == NULL)	return;
	Reverse(T->left);
	Reverse(T->right);
	TNode* temp = T->left;
	T->left = T->right;
	T->right = temp;
}
vector Level(Tree T) {			//层次遍历
	queue Q;
	vector ans;
	Q.push(T);
	while (!Q.empty()) {
		TNode* p = Q.front();
		Q.pop();
		if (p->left != NULL)	Q.push(p->left);
		if (p->right != NULL)Q.push(p->right);
		ans.push_back(p->data);
	}
	return ans;
}
int main() {
	cin >> N;
	for (int i = 0; i < N; i++) cin >> A[i];
	for (int i = 0; i < N; i++) cin >> B[i];
	Tree root = BuildTree(A, B, N);
	Reverse(root);
	vector ans = Level(root);
	for (int i = 0; i < N; i++) {
		cout << ans[i];
		if (i != N - 1)	cout << " ";
	}
	return 0;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1008786.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号