PAT 2020年秋季 7-3 Left-View of Binary Tree (25 分)

The left-view of a binary tree is a list of nodes obtained by looking at the tree from left hand side and from top down. For example, given a tree shown by the figure, its left-view is { 1, 2, 3, 4, 5 }

Given the inorder and preorder traversal sequences of a binary tree, you are supposed to output its left-view.

Input Specification:

Each input file contains one test case. For each case, the first line contains a positive integer N (≤20), which is the total number of nodes in the tree. Then given in the following 2 lines are the inorder and preorder traversal sequences of the tree, respectively. All the keys in the tree are distinct positive integers in the range of int.

Output Specification:

For each case, print in a line the left-view of the tree. All the numbers in a line are separated by exactly 1 space, and there must be no extra space at the beginning or the end of the line.

Sample Input:

8
2 3 1 5 4 7 8 6
1 2 3 6 7 4 5 8

Sample Output:

1 2 3 4 5

实现思路:

没得说,这么简单当时自己都没做全对,九月那次应该是被第一题打死了,直接就崩了,就很简单的利用层序遍历输出第一个结点就可以了。

AC代码:

#include <iostream>
#include <queue>
using namespace std;
const int N=30;
int in[N],pre[N];
struct node {
	int data,high;
	node *l,*r;
};

node* build(int preL,int preR,int inL,int inR) {
	if(preL>preR) return NULL;
	node *root=new node;
	root->data=pre[preL];
	int k;
	for(k=inL; k<=inR; k++) {
		if(root->data==in[k]) break;
	}
	int leftNodeNum=k-inL;
	root->l=build(preL+1,preL+leftNodeNum,inL,k-1);
	root->r=build(preL+leftNodeNum+1,preR,k+1,inR);
	return root;
}
int maxHigh=-1,vist[N]= {0};//maxHigh暴力树的最大高度

void bfs(node *root) {
	queue<node*> q;
	q.push(root);
	root->high=1;//设置根节点高度
	while(!q.empty()) {
		node *now=q.front();
		if(now->high>maxHigh) maxHigh=now->high;
		if(!vist[now->high]) vist[now->high]=now->data;
		q.pop();
		if(now->l) {
			now->l->high=now->high+1;
			q.push(now->l);
		}
		if(now->r) {
			now->r->high=now->high+1;
			q.push(now->r);
		}
	}
}

int main() {
	int n;
	cin>>n;
	for(int i=0; i<n; i++) scanf("%d",&in[i]);
	for(int i=0; i<n; i++) scanf("%d",&pre[i]);
	node *root=build(0,n-1,0,n-1);
	bfs(root);
	for(int i=1; i<=maxHigh; i++) {
		printf("%d",vist[i]);
		if(i<maxHigh) printf(" ");
	}
	return 0;
}
posted @ 2021-03-10 21:46  coderJ_ONE  阅读(93)  评论(0编辑  收藏  举报