PAT 1102 Invert a Binary Tree

本文介绍如何使用C++实现对给定二叉树进行倒置,包括层次遍历(level-order)和中序遍历(in-order),展示了在8节点示例中的操作过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

The following is from Max Howell @twitter:

Google: 90% of our engineers use the software you wrote (Homebrew), but you can't invert a binary tree on a whiteboard so fuck off.

Now it's your turn to prove that YOU CAN invert a binary tree!

Input Specification:

Each input file contains one test case. For each case, the first line gives a positive integer N (≤10) which is the total number of nodes in the tree -- and hence the nodes are numbered from 0 to N−1. Then N lines follow, each corresponds to a node from 0 to N−1, and gives the indices of the left and right children of the node. If the child does not exist, a - will be put at the position. Any pair of children are separated by a space.

Output Specification:

For each test case, print in the first line the level-order, and then in the second line the in-order traversal sequences of the inverted tree. There must be exactly one space between any adjacent numbers, and no extra space at the end of the line.

Sample Input:

8
1 -
- -
0 -
2 7
- -
- -
5 -
4 6

Sample Output:

3 7 2 6 4 0 5 1
6 5 7 4 3 2 0 1

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

没什么好说的。。

#include <iostream>
#include <vector>
#include <queue>
using namespace std;
vector<int> level_order;
vector<int> in_order;

struct node{
	int parent=-1;
	char lchild;
	char rchild;
} nodes[10];

int n;

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

	while(!q.empty())
	{
		int x=q.front();
		q.pop();
		level_order.push_back(x);
		if(nodes[x].rchild!='-') q.push(nodes[x].rchild-'0');
		if(nodes[x].lchild!='-') q.push(nodes[x].lchild-'0');
	}
}
void inorder_tra(int root)
{
	if(nodes[root].rchild != '-') inorder_tra(nodes[root].rchild-'0');
	in_order.push_back(root);
	if(nodes[root].lchild != '-') inorder_tra(nodes[root].lchild-'0');
}
int main()
{
	int id;
	char lchild,rchild;
	cin>>n;
	for(int i=0 ; i<n ; i++)
	{
		cin>>lchild>>rchild;
		nodes[i].lchild = lchild;
		nodes[i].rchild = rchild;

		if(lchild!='-') nodes[lchild-'0'].parent = i;
		if(rchild!='-') nodes[rchild-'0'].parent = i;
	}
	int root;
	for(int i=0 ; i<n ; i++)
		if(nodes[i].parent == -1) 
		{
			root = i;
			break;
		}
	level_tra(root);
	for(int i=0 ; i<n-1 ; i++)
		cout<<level_order[i]<<" ";
	cout<<level_order[n-1];
	cout<<endl;
	inorder_tra(root);
	for(int i=0 ; i<n-1 ; i++)
		cout<<in_order[i]<<" ";
	cout<<in_order[n-1];
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值