PAT甲级 二叉查找树 相关题_C++题解
二叉查找树
PAT (Advanced Level) Practice 二叉查找树 相关题
目录
- 《算法笔记》 重点摘要
- 1099 Build A Binary Search Tree (30)
- 1115 Counting Nodes in a BST (30)
- 1143 Lowest Common Ancestor (30)
《算法笔记》 9.4 二叉查找树 重点摘要
二叉查找树静态实现 ⭐
(1) 定义
struct Node{
typename data;
int level;
int lchild;
int rchild;
} node[MAXN];
(2) 新建结点
int index = 0;
int newNode (int value){
// node[index] = {value,-1,-1};
node[index].data = value;
node->lchild = node->rchild = -1;
return index++;
}
(3) 插入
void insert (int &root, int value){
if (root == -1){
root = newNode(value);
return;
}
if (root->data == value) return;
else if (root->data > value) insert(root->lchild, value);
else insert(root->rchild, value);
}
(4) 创建
int create (int value[], int n){
int root = -1;
for (int i = 0; i < n; i++) insert(root, value[i]);
return root;
}
(5) 查找&修改
void search (int root, int value, int newvalue){
if (root == -1) return;
if (root->data == value) root->data = newvalue;
else if (root->data > value) search(root->lchild, value, newvalue);
else search(root->rchild, value, newvalue);
}
(6) 删除
int findMax (int root){
while (root->rchild != -1) root = root->rchild;
return root;
}
int findMin (int root){
while (root->lchild != -1) root = root->lchild;
return root;
}
void deleteNode (int &root, int value){
if (root == -1) return;
if (root->data == value){
if (root->lchild == -1 && root->rchild == -1)
root = -1;
else if (root->lchild != -1){
int pre = findMax(root->lchild);
root->data = pre->data;
deleteNode(root->lchild, pre->data);
}
else{
int next = findMin(root->rchild);
root->data = next->data;
deleteNode(root->rchild, next->data);
}
}
else if (root->data > value) deleteNode(root->lchild, value);
else deleteNode(root->rchild, value);
}
1099 Build A Binary Search Tree (30)
题目思路
- 主要需要树的结构,其中数据需要后面填,用
vector<pair<int,int>>
储存结点对应左右子结点即可 - 将树结构接收进来后先中序遍历,得到树结点序号对应的中序序列
- 再将数值接收进来,升序排列即为中序遍历
- 以上可将结点序号和数值对应起来,为便于查找,开一个 match 容器,将数值填到结点序号对应位置
- 对树作层序遍历,从队列中弹出结点时将对应的数值压入容器,最后按要求输出
#include<iostream>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
vector<pair<int,int>> tree;
vector<int> in, level, data, match;
void inorder(int root){
if (root == -1) return;
inorder(tree[root].first);
in.push_back(root);
inorder(tree[root].second);
}
void levelorder(int root){
queue<int> q;
q.push(root);
while (!q.empty()){
int now = q.front();
level.push_back(match[now]);
q.pop();
if (tree[now].first != -1) q.push(tree[now].first);
if (tree[now].second != -1) q.push(tree[now].second);
}
}
int main()
{
int n;
scanf("%d", &n);
tree.resize(n);
for (int i = 0; i < n; i++)
scanf("%d%d", &tree[i].first, &tree[i].second);
data.resize(n);
for (int i = 0; i < n; i++)
scanf("%d", &data[i]);
sort(data.begin(), data.end());
inorder(0);
match.resize(n);
for (int i = 0; i < n; i++) match[in[i]] = data[i];
levelorder(0);
for (int i = 0; i < n; i++) printf("%d%c", level[i], i+1 == n ? '\n' : ' ');
return 0;
}
1115 Counting Nodes in a BST (30)
- 注意:当树退化成一条链时,若根从1开始,则树深度有1000,levelnum 数组大小开为 1000 会越界=》根节点层数从 0 开始
#include<iostream>
using namespace std;
struct Node{
int data, lchild, rchild;
} node[1000];
int index = 0, depth = -1, levelnum[1000] = {0};
void insert(int &root, int value){
if (root == -1){
node[index] = {value, -1, -1};
root = index++;
}
else if (node[root].data >= value) insert(node[root].lchild, value);
else insert(node[root].rchild, value);
}
void DFS(int root, int level){
levelnum[level]++;
if (level > depth) depth = level;
if (node[root].lchild != -1) DFS(node[root].lchild, level+1);
if (node[root].rchild != -1) DFS(node[root].rchild, level+1);
}
int main()
{
int n, data, root = -1;
scanf("%d", &n);
for (int i = 0; i < n; i++){
scanf("%d", &data);
insert(root, data);
}
DFS(0,0);
printf("%d + %d = %d\n", levelnum[depth], levelnum[depth-1], levelnum[depth]+levelnum[depth-1]);
return 0;
}
1143 Lowest Common Ancestor (30)
题目思路
- LCA 的性质:大于一个子节点,小于另一个子节点
- 题目给出先序遍历
- 依次判断是否符合 LCA 性质
- 由于可能一个点是另一个点的祖先,应当允许 == 情况
- ?为什么按先序遍历能得到呢orz
#include<iostream>
#include<vector>
#include<unordered_map>
using namespace std;
int main()
{
int m, n, u, v, root;
scanf("%d%d", &m, &n);
vector<int> pre(n);
unordered_map<int,bool> keys;
for (int i = 0; i < n; i++){
scanf("%d", &pre[i]);
keys[pre[i]] = true;
}
for (int i = 0; i < m; i++){
scanf("%d%d", &u, &v);
if (!keys[u] && !keys[v]) printf("ERROR: %d and %d are not found.\n", u, v);
else if (!keys[u]) printf("ERROR: %d is not found.\n", u);
else if (!keys[v]) printf("ERROR: %d is not found.\n", v);
else{
for (root = 0; root < n; root++)
if ((pre[root] >= u && pre[root] <= v) || (pre[root] <= u && pre[root] >= v)) break;
if (pre[root] == u || pre[root] == v) printf("%d is an ancestor of %d.\n", pre[root]==u?u:v, pre[root]==u?v:u);
else printf("LCA of %d and %d is %d.\n", u, v, pre[root]);
}
}
return 0;
}
附:
二叉查找树链式实现
(1) 定义
struct Node{
typename data;
int level
Node* lchild;
Node* rchild;
}
(2) 新建结点
Node* newNode (int value){
Node* node = new Node;
node->data = value;
node->lchild = node->rchild = NULL;
return node;
}
(3) 插入
void insert (Node* &root, int value){
if (root == NULL){
root = newNode(value);
return;
}
if (root->data == value) return;
else if (root->data > value) insert(root->lchild, value);
else insert(root->rchild, value);
}
(4) 创建
Node* create (int value[], int n){
node* root = NULL;
for (int i = 0; i < n; i++) insert(root, value[i]);
return root;
}
(5) 查找&修改
void search (Node* root, int value, int newvalue){
if (root == NULL) return;
if (root->data == value) root->data = newvalue;
else if (root->data > value) search(root->lchild, value, newvalue);
else search(root->rchild, value, newvalue);
}
(6) 删除
Node* findMax (Node* root){
while (root->rchild != NULL) root = root->rchild;
return root;
}
Node* findMin (Node* root){
while (root->lchild != NULL) root = root->lchild;
return root;
}
void deleteNode (Node* root, int value){
if (root == NULL) return;
if (root->data == value){
if (root->lchild == NULL && root->rchild == NULL)
root = NULL;
else if (root->lchild != NULL){
Node* pre = findMax(root->lchild);
root->data = pre->data;
deleteNode(root->lchild, pre->data);
}
else{
Node* next = findMin(root->rchild);
root->data = next->data;
deleteNode(root->rchild, next->data);
}
}
else if (root->data > value) deleteNode(root->lchild, value);
else deleteNode(root->rchild, value);
}
PAT甲级 二叉查找树 相关题_C++题解的更多相关文章
- PAT甲级 Dijkstra 相关题_C++题解
Dijkstra PAT (Advanced Level) Practice Dijkstra 相关题 目录 <算法笔记>重点摘要 1003 Emergency (25) <算法笔记 ...
- PAT甲级 二叉树 相关题_C++题解
二叉树 PAT (Advanced Level) Practice 二叉树 相关题 目录 <算法笔记> 重点摘要 1020 Tree Traversals (25) 1086 Tree T ...
- PAT甲级 图 相关题_C++题解
图 PAT (Advanced Level) Practice 用到图的存储方式,但没有用到图的算法的题目 目录 1122 Hamiltonian Cycle (25) 1126 Eulerian P ...
- PAT甲级 树 相关题_C++题解
树 目录 <算法笔记>重点摘要 1004 Counting Leaves (30) 1053 Path of Equal Weight (30) 1079 Total Sales of S ...
- PAT甲级 堆 相关题_C++题解
堆 目录 <算法笔记>重点摘要 1147 Heaps (30) 1155 Heap Paths (30) <算法笔记> 9.7 堆 重点摘要 1. 定义 堆是完全二叉树,树中每 ...
- PAT甲级 散列题_C++题解
散列 PAT (Advanced Level) Practice 散列题 目录 <算法笔记> 重点摘要 1002 A+B for Polynomials (25) 1009 Product ...
- PAT甲级 字符串处理题_C++题解
字符串处理题 目录 <算法笔记> 重点摘要 1001 A+B Format (20) 1005 Spell It Right (20) 1108 Finding Average (20) ...
- PAT甲级 并查集 相关题_C++题解
并查集 PAT (Advanced Level) Practice 并查集 相关题 <算法笔记> 重点摘要 1034 Head of a Gang (30) 1107 Social Clu ...
- PAT甲级 图的遍历 相关题_C++题解
图的遍历 PAT (Advanced Level) Practice 图的遍历 相关题 目录 <算法笔记>重点摘要 1021 Deepest Root (25) 1076 Forwards ...
随机推荐
- (转)libvirt和qemu编译安装
借鉴:https://www.cnblogs.com/grglym/p/8053553.html 借鉴:http://blog.chinaunix.net/uid-31410005-id-577189 ...
- OpenFOAM Tutorial Standard Solvers【转载】
转载自:http://www.cnblogs.com/fortran/articles/1996927.html boundaryFoam Steady-state solver for 1D tur ...
- 2018-2019-2 (内附jdk与webgoat完整安装教程)《网络对抗技术》Exp9 Web安全基础 Week13 20165233
Exp9 Web安全基础 目录 一.基础问题 二.实验步骤 实验前准备:jdk与webgoat的安装 实验点一:SQL 命令注入(Command Injection) 数字型注入(Numeric SQ ...
- 解决Mac系统IDEA debug卡顿问题
查询资料发现,跟JDK8以及hosts设置有关. vim /private/etc/hosts 在127.0.0.1 localhost后面加上主机名即可,如<your hostname> ...
- Docker学习知识图
这个图更能明白他们之间的关系 文章来源:外星人来地球 欢迎关注,有问题一起学习欢迎留言.评论
- imfilter
图像处理函数详解——imfilter功能:对任意类型数组或多维图像进行滤波.用法:B = imfilter(A,H) B = imfilter(A,H,option1,option2,...) 或写作 ...
- P5658 括号树
P5658 括号树 题解 太菜了啥都不会写只能水5分数据 啥都不会写只能翻题解 题解大大我错了 我们手动找一下规律 我们设 w[ i ] 为从根节点到结点 i 对答案的贡献,也就是走到结点 i ,合 ...
- Swift_IOS之UIActivityIndicatorView加载齿轮控件
// // ViewController.swift // helloIOS // // Created by loaderman on 2019/1/25. // Copyright © 2019年 ...
- osg #ifdef _WIN32 osg
#ifdef _WIN32 #include <Windows.h> #endif // _WIN32 #include <osgViewer/Viewer> #include ...
- navigationBarTitleText
想修改整个程序的导航栏,在app.json 文件 修改 "window": { "backgroundTextStyle": "light" ...