PAT甲级-树专题08-1102 Invert a Binary Tree (25分)-二叉树的存储-反转树-层次遍历-中序遍历

  • 二叉树的的存储:对于节点i,有左孩子l[i],右孩子r[i]
  • 二叉树反转:dfs遍历,对每个点交换左右子树
  • 层次遍历用队列
  • 中序用递归
#include<bits/stdc++.h>

using namespace std;

const int maxn = 15;
int n,k;
int l[maxn],r[maxn];
bool fa[maxn];
queue<int> q;

void invert(int x) {
	if(l[x]==-1 && r[x]==-1) return;

	swap(l[x],r[x]);
	if(l[x]!=-1) invert(l[x]);
	if(r[x]!=-1) invert(r[x]);
}

void levelorder() {
	int tmp = q.front();
	cout << tmp;
	while(q.size()) {
		int t = q.front();q.pop();
		int x = l[t],y = r[t];
		if(x != -1) {
			cout << " "<<x;
			q.push(x);
		}
		if(y != -1) {
			cout << " "<<y;
			q.push(y);
		}
	}
}

void inorder(int x) {
	int a = l[x],b = r[x];
	if(a!=-1) {
		inorder(a);
	}
	cout << x ;
	k ++;
	if(k!=n) cout <<" ";
	if(b!=-1) {
		inorder(b);
	}
}

int main()
{
	cin >> n;
	memset(l,-1,sizeof(l));
	memset(r,-1,sizeof(r));
	for(int i=0;i<n;i++) {
		char x,y;
		cin >> x >> y;
		if(x!='-') l[i]=(x-'0'),fa[x-'0']=1;
		if(y!='-') r[i]=(y-'0'),fa[y-'0']=1;
	}
	int root = -1;
	for(int i=0;i<n;i++) if(!fa[i]) root = i;

	invert(root);
	
//	for(int i=0;i<n;i++) {
//		cout << l[i]<<" "<<r[i]<<endl;
//	}
	q.push(root);
	levelorder();
	cout << endl;
	inorder(root);
	
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值