【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
#include
#include
#include

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 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<data<<" "<level<left, depth + 1);
    dfs(root->right, depth + 1);
    

}

int main()
{
	scanf("%d",&n);
	node* root=NULL;
	int temp;
	
	for(int i=0;i

 

 

 

 

 

 

你可能感兴趣的:(算法修炼)