2020 天梯模擬賽 L2-3 二叉搜尋樹的2層結點統計
阿新 • • 發佈:2022-04-03
二叉搜尋樹或者是一棵空樹,或者是具有下列性質的二叉樹:若它的左子樹不空,則左子樹上所有結點的值均小於或等於它的根結點的值;若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值;它的左、右子樹也分別為二叉搜尋樹。
將一系列數字按給定順序插入一棵初始為空的二叉搜尋樹,你的任務是統計結果樹中最下面 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; }