1102 Invert a Binary Tree (25分)

//转置二叉树仅需节点的左右子树互换

层次遍历+中序遍历

 

#include <iostream>

#include <vector>

#include <queue>

#include <algorithm>

using namespace std;
const int N =10+5;
struct Node{
	int l, r;
	Node(){
		l = r = -1;
	}
}T[N];

bool vis[N];
bool flag = true;

void inorder(int root) {

	if (root == -1) return;

	inorder(T[root].l);

	if (flag) flag = false;
	else cout << " ";
	cout << root ;
	
	inorder(T[root].r);
}

void levelorder(int root) {
	queue<int> q;
	q.push(root);

	while (!q.empty()) {

		int tmp = q.front();

		q.pop();

		if (flag) flag = false;
		else cout <<" ";
		
		cout << tmp;
		if (T[tmp].l != -1) q.push(T[tmp].l);
		if (T[tmp].r != -1) q.push(T[tmp].r);

	}

}


int main() {
	int n;
	char a, b;

	cin >> n;

	for (int i = 0; i < n; ++i) {
		cin >> a >> b;
//直接交换节点左右子树即可 
		if(a != '-') T[i].r = a-'0';
		if(b != '-') T[i].l = b-'0';
		
		vis[a-'0'] = true;
		vis[b-'0'] = true;
	}

	int root;

	for (int i = 0; i < n; ++i) {

		if (vis[i] == 0) root = i;

	}

	levelorder(root);
	cout << endl;
	flag = true;
	inorder(root);

	return 0;

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值