PAT(Advanced)甲级1115 Counting Nodes in a BST 先序遍历 C++实现
题目链接
题目大意
给定一个序列,建立二叉搜索树,根据题目给出二叉排序树定义,在二叉搜索树中的的任一节点其左子树的所有节点关键字小于等于
该节点关键字,其左子树的所有节点关键字大于
该节点关键字,其左右子树也必须是一棵二叉搜索树,可以存在关键字相同的节点
算法思路
根据题意,先建立二叉搜索树
BST::BST(vector<int>& sequence) {
root = NULL;
level.resize(sequence.size());
for (vector<int>::iterator it = sequence.begin(); it != sequence.end(); it++) {
insert(root, *it);
}
depth = 0;
preOrderTraverse(root, 0);
}
void BST::insert(Node* &p, int value) {
// 第一个参数为指针的引用,改变当前结点父亲节点(若有)的对应子树指针,方便插入
if (p == NULL) {
// 找到空节点
p = new Node(value);
return;
}
// 若小于等于当前结点关键字则到左子树中递归查找位置,否则在右子树中查找
insert((p->data >= value ? p->left : p->right), value);
}
先序遍历,递归地计算每一层有多少结点,存入level
数组
void BST::preOrderTraverse(Node *p, int currentLevel) {
if (p == NULL) {
return;
}
depth = max(depth, currentLevel);
level[currentLevel]++;
preOrderTraverse(p->left, currentLevel + 1);
preOrderTraverse(p->right, currentLevel + 1);
}
AC代码
/*
author : eclipse
email : eclipsecs@qq.com
time : Sun Jun 28 20:30:05 2020
*/
#include <bits/stdc++.h>
using namespace std;
struct Node {
int data;
Node *left;
Node *right;
Node(int value) : data(value), left(NULL), right(NULL) {}
};
class BST {
private:
Node *root;
vector<int> level;
int depth;
void insert(Node* &p, int value);
void preOrderTraverse(Node *p, int currentLevel);
public:
BST(vector<int>& sequence);
void print();
};
BST::BST(vector<int>& sequence) {
root = NULL;
level.resize(sequence.size());
for (vector<int>::iterator it = sequence.begin(); it != sequence.end(); it++) {
insert(root, *it);
}
depth = 0;
preOrderTraverse(root, 0);
}
void BST::insert(Node* &p, int value) {
if (p == NULL) {
p = new Node(value);
return;
}
insert((p->data >= value ? p->left : p->right), value);
}
void BST::preOrderTraverse(Node *p, int currentLevel) {
if (p == NULL) {
return;
}
depth = max(depth, currentLevel);
level[currentLevel]++;
preOrderTraverse(p->left, currentLevel + 1);
preOrderTraverse(p->right, currentLevel + 1);
}
void BST::print() {
printf("%d + %d = %d", level[depth], level[depth - 1], level[depth] + level[depth - 1]);
}
int main(int argc, char const *argv[]) {
int N;
scanf("%d", &N);
vector<int> sequence;
sequence.resize(N);
for (int i = 0; i < sequence.size(); i++) {
scanf("%d", &sequence[i]);
}
BST *bst = new BST(sequence);
bst->print();
return 0;
}
样例输入
9
25 30 42 16 20 20 35 -5 28
样例输出
2 + 4 = 6
鸣谢
最后
- 由于博主水平有限,不免有疏漏之处,欢迎读者随时批评指正,以免造成不必要的误解!