1. 程式人生 > 其它 >2020 天梯模擬賽 L2-3 二叉搜尋樹的2層結點統計

2020 天梯模擬賽 L2-3 二叉搜尋樹的2層結點統計

二叉搜尋樹或者是一棵空樹,或者是具有下列性質的二叉樹:若它的左子樹不空,則左子樹上所有結點的值均小於或等於它的根結點的值;若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值;它的左、右子樹也分別為二叉搜尋樹。

將一系列數字按給定順序插入一棵初始為空的二叉搜尋樹,你的任務是統計結果樹中最下面 2 層的結點數。

輸入格式:輸入在第一行給出一個正整數 N (≤1000),為插入數字的個數。第二行給出 N 個 [−1000,1000] 區間內的整數。數字間以空格分隔。

輸出格式:在一行中輸出最下面 2 層的結點總數。

輸入樣例:

9
25 30 42 16 20 20 35 -5 28

輸出樣例:

6

這道題的思路就是先用遞迴的思想,將一個一個結點存入樹當中,然後再對這棵樹進行遍歷,到最下面2層的時候,就開始對結點計數。

#include<bits/stdc++.h>
using namespace std;
int maxn=0,num=0;//maxn用來記錄樹的最大深度,num用來記錄最下面兩層的結點數 
typedef struct Tnode//定義樹的結構體 
{
	int data;
	Tnode *lchild;
	Tnode *rchild;
}*Bitree;
void create_tree(Bitree &T,int x,int h)
{
 	if(T==NULL)
 	{  
		T=(Bitree)malloc(sizeof(Tnode));
		T->data=x;
		T->lchild=NULL;
		T->rchild=NULL;
		if(maxn<h)//及時更新maxn的值 
			maxn=h;
	}
	else if(x<=T->data)//根據題意,小於等於根結點的值就放在左子樹上 
		create_tree(T->lchild,x,h+1);
	else create_tree(T->rchild,x,h+1);//大於根結點的值就放在右子樹上 
}
int preorder(Bitree T,int h)//先序遍歷 
{
	if(T==NULL) return 0;
 	if(h>=maxn-1) num++;//如果已經在最下面兩層,就開始對結點計數 
 	preorder(T->lchild,h+1);
 	preorder(T->rchild,h+1);
 	return 1;
}
int main()
{
	int n,x;
	Bitree T=NULL;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&x);
		create_tree(T,x,1);
	}
	preorder(T,1);
	cout<<num;
	return 0;
}