【PAT甲级】1115 Counting Nodes in a BST (二叉搜索树的遍历)

题目:

A Binary Search Tree (BST) is recursively defined as a binary tree which has the following properties:

  • The left subtree of a node contains only nodes with keys less than or equal to the node's key.
  • The right subtree of a node contains only nodes with keys greater than the node's key.
  • Both the left and right subtrees must also be binary search trees.

Insert a sequence of numbers into an initially empty binary search tree. Then you are supposed to count the total number of nodes in the lowest 2 levels of the resulting tree.

Input Specification:

Each input file contains one test case. For each case, the first line gives a positive integer N (≤1000) which is the size of the input sequence. Then given in the next line are the N integers in [−10001000] which are supposed to be inserted into an initially empty binary search tree.

Output Specification:

For each case, print in one line the numbers of nodes in the lowest 2 levels of the resulting tree in the format:

n1 + n2 = n

where n1 is the number of nodes in the lowest level, n2 is that of the level above, and n is the sum.

Sample Input:

9
25 30 42 16 20 20 35 -5 28

Sample Output:

2 + 4 = 6

 

题目大意:

输出一个二叉搜索树的最后两层结点个数a和b,以及他们的和c:“a + b = c”

 

分析:

题目本身并不难,只涉及到BST的构建,BST的遍历。

遍历也有两种方法:

  1. BFS:需要在构建BST时为每个结点添加一个所在的层数level域
  2. DFS:正常构建BST就行。

写本题的最大收获是:以后涉及层数相关的计算时,尽量不要用BFS,因为如果不熟练的话,添加一个level域会造成很多麻烦,请尽量使用DFS。

解题:

#include<iostream>
#include<vector>
#include<queue>
#include<algorithm>

using namespace std;
struct node{
	int data;
	node *left,*right;
	//int level;
};

int n;
int cnt[1000]={0};
int maxdepth=-1;


void insert(node* &root,int data)
{
	if(root==NULL)
	{
		root=new node;
		root->data=data;
		root->left=root->right=NULL;
		return;
		//root->level=level;
	}
	
	//int next_level=root->level+1;
	if(data <= root->data) insert(root->left,data);
	if(data > root->data) insert(root->right,data);
	
}

/*
void bfs(node* root)
{
	int count[n]={0};
	int max_level=0;
	queue<node*> q;
	q.push(root);
	while(!q.empty())
	{
		node* top=q.front();
		q.pop();
		count[top->level]++;
		if(top->level>max_level) max_level=top->level;
		if(top->left!=NULL) q.push(top->left);
		if(top->right!=NULL) q.push(top->right);
		//cout<<top->data<<" "<<top->level<<endl;
	}
	int a=count[max_level-1];
	int b=count[max_level];
	printf("%d + %d = %d",a,b,a+b);
}
*/

void dfs(node* root,int depth)
{

	if(root == NULL)
	{
        maxdepth = max(depth, maxdepth);
        return ;
    }
    cnt[depth]++;
    dfs(root->left, depth + 1);
    dfs(root->right, depth + 1);
    

}

int main()
{
	scanf("%d",&n);
	node* root=NULL;
	int temp;
	
	for(int i=0;i<n;i++)
	{
		scanf("%d",&temp);
		insert(root,temp);
	} 
	//bfs(root);
	dfs(root,0);
	int a=cnt[maxdepth-1];
	int b=cnt[maxdepth-2];
	printf("%d + %d = %d",a,b,a+b);
	return 0;
}

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值