PAT甲 1102. Invert a Binary Tree (25)

本文介绍了一种算法实现,用于翻转二叉树并进行层次和中序遍历。通过输入二叉树的节点关系,文章提供了一个具体的样例及AC代码,展示了如何确定根节点并实现树的翻转。

摘要生成于 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
由于这道题没有给出根节点所以需要自己去求,其他没有什么难点。注意题目要求的是将左右节点交换输出,所以只要在输入的时候就交换就好,剩下的只需要一个层次遍历和中序遍历。
ac代码
#include <stdio.h>
#include <string>
#include <stdlib.h>
#include <string.h>
#include <queue>
using namespace std;
 struct node
 {
 	node():l(-1),r(-1){}; //对节点的初始化,默认情况下左右均为-1
 	int l,r,id;
 };
 node tree[15];
 int notree[15];
 int f1=1,f2;
  void inorder(int root)  //中序遍历
  {
  	if(tree[root].l!=-1)
  	{
  		inorder(tree[root].l);
  	}
  	if(f1)
  	{
  		f1=0;
  		printf("%d",root);
  	}
  	else
  		printf(" %d",root);


  	if(tree[root].r!=-1)
  	{
  		inorder(tree[root].r);
  	}




  }
  int main()
 {
 	int i,n,temp,root;
 	char l[5],r[5];
 	scanf("%d",&n);
 	for(i=0;i<n;i++)
 	{
 		tree[i].id=i;
 	}
 	for(i=0;i<n;i++)
 	{
 		scanf("%s%s",r,l);
 		if(r[0]!='-')
 		{
 			temp=atoi(r);
 			tree[i].r=temp;
 			notree[temp]=1;
 		}
 		if(l[0]!='-')
 		{
 			temp=atoi(l);
 			tree[i].l=temp;
 			notree[temp]=1;
 		}
	 }
	 for(i=0;i<n;i++)
	 {
	 	if(notree[i]!=1)
	 		{
	 			root=i;
	 			break;
	 		}
	 }
	 queue<node> tr;   //层次遍历
	 tr.push(tree[root]);
	 f2=1;
	 while(!tr.empty())   
	 {
	 	node tem = tr.front();
	 	tr.pop();
	 	 if(f2==1)
	 	 {
	 	 	printf("%d",tem.id);
	 	 	f2=0;
	 	 }
	 	 else
	 	 	printf(" %d",tem.id);
	 	 if(tem.l!=-1)
 		{
 			tr.push(tree[tem.l]);
 		}
	 	 if(tem.r!=-1)
 		{
 			tr.push(tree[tem.r]);
 		}


	 }


	 printf("\n");
	 inorder(root);
	 printf("\n");


	 return 0;
}



                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值