本文主要是介绍PAT甲级1115 Counting Nodes in a BST (30分):[C++题解] 递归建二叉搜索树、dfs求一层结点数量,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- 题目分析
- 题目链接
题目分析
分析
首先本题给定的二叉搜索树的定义和其他地方的不同。本题小于等于的是左子树,右子树是大于根结点的。
然后说一下做题的思路。
给定一串数据,让构造二叉搜索树。 先想一想怎么存二叉树,想用左儿子数组l[ ] 和右儿子数组 r[ ] 来存。这样就得从根结点一直递归下去,其实给定的第一个数就是根结点。
建树的过程其实还是一个递归。比较待插入的值和当前这个结点的大小关系,如果是小于等于,就插入到左边;如果是大于当前结点,就插入到右边。
对于求倒数两层的结点数量,统计每一层的结点数用的是dfs,没用bfs的原因是还多写队列,代码更长一点。相比之下dfs代码短很多,每层的结点数量存在cnt [ ] 数组中。
下面是根据一串数据递归建造二叉搜索树的代码
/*
insert用来构造二叉搜索树
u:结点下标
w:权重
*/
void insert(int& u ,int w){//如果遍历到某个点发现是空的,就生成新的结点,插入进来// u == 0表示空结点if(u == 0){u = ++ idx;v[u] = w;}//否则的话当前结点有值,比对一下插入左边还是右边else if( w <= v[u]) insert(l[u], w);else insert(r[u], w);
}
需要记录一下,每来一个数据都是从根结点比下来的,小于等于根结点就往左,大于就往右。这样的代价是用了一个根结点,两个儿子数组。
AC代码
#include<bits/stdc++.h>
using namespace std;const int N = 1010;int n;
int l[N] ,r[N];
int v[N]; //权值
int idx; //当前用到的编号,idx从1开始int cnt[N];//每层节点的数量
int max_depth; //最大层数/*
insert用来构造二叉搜索树
u:结点下标
w:权重
*/
void insert(int& u ,int w){//如果遍历到某个点发现是空的,就生成新的结点,插入进来// u == 0表示空结点if(u == 0){u = ++ idx;v[u] = w;}//否则的话当前结点有值,比对一下插入左边还是右边else if( w <= v[u]) insert(l[u], w);else insert(r[u], w);
}//dfs深度优先搜索,求每一层的结点数
void dfs( int u, int depth){if( u == 0) return;cnt[depth] ++; //depth这一层的结点数量++max_depth = max(max_depth, depth);dfs(l[u],depth+1);dfs(r[u],depth+1);
}
int main(){cin >> n;int root = 0;for ( int i =1; i<= n; i ++){int w;cin>> w;insert(root, w);//根结点下标是1}dfs(root, 0); //从根结点开始,根结点是第0层int n1 = cnt[max_depth] ,n2 = cnt[max_depth -1];printf("%d + %d = %d",n1,n2,n1+n2);}
题目链接
PAT甲级1115 Counting Nodes in a BST (30分)
这篇关于PAT甲级1115 Counting Nodes in a BST (30分):[C++题解] 递归建二叉搜索树、dfs求一层结点数量的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!