ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

PAT 1155 Heap Paths

2021-03-06 20:59:37  阅读:165  来源: 互联网

标签:node Paths PAT 1155 data int heap root lchild


In computer science, a heap is a specialized tree-based data structure that satisfies the heap property: if P is a parent node of C, then the key (the value) of P is either greater than or equal to (in a max heap) or less than or equal to (in a min heap) the key of C. A common implementation of a heap is the binary heap, in which the tree is a complete binary tree. (Quoted from Wikipedia at https://en.wikipedia.org/wiki/Heap_(data_structure))

One thing for sure is that all the keys along any path from the root to a leaf in a max/min heap must be in non-increasing/non-decreasing order.

Your job is to check every path in a given complete binary tree, in order to tell if it is a heap or not.

Input Specification:
Each input file contains one test case. For each case, the first line gives a positive integer N (1<N≤1,000), the number of keys in the tree. Then the next line contains N distinct integer keys (all in the range of int), which gives the level order traversal sequence of a complete binary tree.

Output Specification:
For each given tree, first print all the paths from the root to the leaves. Each path occupies a line, with all the numbers separated by a space, and no extra space at the beginning or the end of the line. The paths must be printed in the following order: for each node in the tree, all the paths in its right subtree must be printed before those in its left subtree.

Finally print in a line Max Heap if it is a max heap, or Min Heap for a min heap, or Not Heap if it is not a heap at all.

在这里插入图片描述
其实这个题我并没有解出来,因为关于二叉树其实我是今天才看了相关内容,偏向于用代码构建二叉树,导致做题时思考的方向错了。 后来看了别人的代码才发现原来只是利用的完全二叉树的性质罢了。
我的源代码:(错误示范)

#include<iostream>
#include<vector>
using namespace std;
struct node{
	int data;
	node* lchild;
	node* rchild;
};
vector<node> v;
void DFS(node* root){//其实感觉只要实现了创建树这里应该是没问题的
	if(root==NULL){
		return;
	}
	else{
		node top;
	top.data=root->data;
	top.lchild=root->lchild;
	top.rchild=root->rchild;
	v.push_back(top);
	if(root->lchild==NULL){
		for(int i=0;i<v.size()-1;i++) cout<<v[i].data<<" ";
		cout<<root->data<<endl;
		v.pop_back();
		return;
	}
	else{
		DFS(root->rchild);
    	DFS(root->lchild);
    	return;
	}
	
	}
	
}
void insert(node* &root,int x){
	if(root==NULL){
		root=new node;
		root->data=x;
		root->lchild=NULL;
		root->rchild=NULL;
		return;
	}
	if(root->lchild==NULL) insert(root->lchild,x);
	else insert(root->rchild,x);
	return;
}
node* Create(int data[],int n){
	node* root=NULL;
	for(int i=1;i<=n;i++) insert(root,data[i]);
	return root;
}
int main(){
	int n;
	cin>>n;
	int data[n+1];
	for(int i=1;i<=n;i++) cin>>data[i];
	node* root=Create(data,n);
	DFS(root);
	return 0;
}

这个程序没有写出来的主要原因是没能想到如何把题中给的层序遍历的序列用来建立树。(代码中的后来自己试的时候感觉有问题)
学到的:

  1. DFS函数一般都以下标作为参数

  2. 学到了一种输出数组中元素之间有空格末尾无空格的写法:
    for(int i=0;i<v.size();i++) printf("%d%s",v[i],i!=v.size()-1?" “:”\n");

  3. 这个题使用层序遍历序列的方便之处,它本身的位置与书本上的定义一致,所以判断是否是最大/小堆的话只要依次判断是否data[i/2]<=data[i];

标签:node,Paths,PAT,1155,data,int,heap,root,lchild
来源: https://blog.csdn.net/virtual_YL/article/details/114451808

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有