9.1树与二叉树
![](https://i-blog.csdnimg.cn/direct/e9a7015dc4994b659cde1c177175b32a.png)
![](https://i-blog.csdnimg.cn/direct/891ce46341f941eea07cb519ed0d0c1d.png)
#include <cstdio>
int main() {
int n, m;
scanf("%d%d", &n, &m);
printf(n == m + 1 ? "Yes" : "No");
return 0;
}
9.2二叉树的遍历
![](https://i-blog.csdnimg.cn/direct/5e942afb0edf422f8babe22f49b99f25.png)
![](https://i-blog.csdnimg.cn/direct/fc2e441cb9664a4fbe66dfcd43637613.png)
#include <cstdio>
#include <vector>
using namespace std;
const int MAXN = 50;
struct Node {
int l, r;
} nodes[MAXN];
vector<int> pre;
void preOrder(int root) {
if (root == -1) {
return;
}
pre.push_back(root);
preOrder(nodes[root].l);
preOrder(nodes[root].r);
}
int main() {
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d%d", &nodes[i].l, &nodes[i].r);
}
preOrder(0);
for (int i = 0; i < (int)pre.size(); i++) {
printf("%d", pre[i]);
if (i < (int)pre.size() - 1) {
printf(" ");
}
}
return 0;
}
![](https://i-blog.csdnimg.cn/direct/32891bbcbae94000bf1a82c8d4c8c5d7.png)
![](https://i-blog.csdnimg.cn/direct/3590831bdc744bdc88b4a1982c20b64e.png)
#include <cstdio>
#include <vector>
using namespace std;
const int MAXN = 50;
struct Node {
int l, r;
} nodes[MAXN];
vector<int> pre;
void preOrder(int root) {
if (root == -1) {
return;
}
preOrder(nodes[root].l);
pre.push_back(root);
preOrder(nodes[root].r);
}
int main() {
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d%d", &nodes[i].l, &nodes[i].r);
}
preOrder(0);
for (int i = 0; i < (int)pre.size(); i++) {
printf("%d", pre[i]);
if (i < (int)pre.size() - 1) {
printf(" ");
}
}
return 0;
}
![](https://i-blog.csdnimg.cn/direct/6e05e0d184f544d8983d4a1632bd8305.png)
![](https://i-blog.csdnimg.cn/direct/7a26e89959fe4038bcc1025f67723e17.png)
#include <cstdio>
#include <vector>
using namespace std;
const int MAXN = 50;
struct Node {
int l, r;
} nodes[MAXN];
vector<int> pre;
void preOrder(int root) {
if (root == -1) {
return;
}
preOrder(nodes[root].l);
preOrder(nodes[root].r);
pre.push_back(root);
}
int main() {
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d%d", &nodes[i].l, &nodes[i].r);
}
preOrder(0);
for (int i = 0; i < (int)pre.size(); i++) {
printf("%d", pre[i]);
if (i < (int)pre.size() - 1) {
printf(" ");
}
}
return 0;
}
![](https://i-blog.csdnimg.cn/direct/996e1a8852b9420e93a03ba714fbf7e0.png)
![](https://i-blog.csdnimg.cn/direct/7441ad39f7c240afa73b07c6549bc3eb.png)
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
const int MAXN = 50;
struct Node {
int l, r;
} nodes[MAXN];
vector<int> layer;
void layerOrder(int root) {
queue<int> q;
q.push(root);
while (!q.empty()) {
int front = q.front();
q.pop();
layer.push_back(front);
if (nodes[front].l != -1) {
q.push(nodes[front].l);
}
if (nodes[front].r != -1) {
q.push(nodes[front].r);
}
}
}
int main() {
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d%d", &nodes[i].l, &nodes[i].r);
}
layerOrder(0);
for (int i = 0; i < (int)layer.size(); i++) {
printf("%d", layer[i]);
if (i < (int)layer.size() - 1) {
printf(" ");
}
}
return 0;
}
![](https://i-blog.csdnimg.cn/direct/0b913fe7c28d40b7b714958d46d890ef.png)
![](https://i-blog.csdnimg.cn/direct/e777be972d5345cd935478772dab5938.png)
#include <cstdio>
#include <algorithm>
using namespace std;
const int MAXN = 50;
struct Node {
int l, r;
} nodes[MAXN];
int getHeight(int root) {
if (root == -1) {
return 0;
}
int leftHeight = getHeight(nodes[root].l);
int rightHeight = getHeight(nodes[root].r);
return max(leftHeight, rightHeight) + 1;
}
int main() {
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d%d", &nodes[i].l, &nodes[i].r);
}
printf("%d", getHeight(0));
return 0;
}
![](https://i-blog.csdnimg.cn/direct/ddd4ddb88cd3492681c2ed61969b54f3.png)
![](https://i-blog.csdnimg.cn/direct/914b641ca4e84d0baebda059c3029519.png)
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
const int MAXN = 50;
struct Node {
int l, r;
} nodes[MAXN];
int layers[MAXN];
void layerOrder(int root) {
queue<int> q;
q.push(root);
int layer = 1;
while (!q.empty()) {
int cnt = q.size();
for (int i = 0; i < cnt; i++) {
int front = q.front();
q.pop();
layers[front] = layer;
if (nodes[front].l != -1) {
q.push(nodes[front].l);
}
if (nodes[front].r != -1) {
q.push(nodes[front].r);
}
}
layer++;
}
}
int main() {
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d%d", &nodes[i].l, &nodes[i].r);
}
layerOrder(0);
for (int i = 0; i < n; i++) {
printf("%d", layers[i]);
if (i < n - 1) {
printf(" ");
}
}
return 0;
}
![](https://i-blog.csdnimg.cn/direct/9cca7e6645d446e1b3206ad81ca0a28f.png)
![](https://i-blog.csdnimg.cn/direct/d1036e172e00408680ca7a6682f2634b.png)
#include <cstdio>
#include <vector>
using namespace std;
const int MAXN = 50;
struct Node {
int l, r;
} nodes[MAXN];
vector<int> pre, in, post;
int buildTree(int preL, int preR, int inL, int inR) {
if (preL > preR) {
return -1;
}
int root = pre[preL];
int inIndexOfRoot;
for (int i = inL; i <= inR; i++) {
if (in[i] == root) {
inIndexOfRoot = i;
break;
}
}
int leftCount = inIndexOfRoot - inL;
nodes[root].l = buildTree(preL + 1, preL + leftCount, inL, inIndexOfRoot - 1);
nodes[root].r = buildTree(preL + leftCount + 1, preR, inIndexOfRoot + 1, inR);
return root;
}
void postOrder(int root) {
if (root == -1) {
return;
}
postOrder(nodes[root].l);
postOrder(nodes[root].r);
post.push_back(root);
}
int main() {
int n, x;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &x);
pre.push_back(x);
}
for (int i = 0; i < n; i++) {
scanf("%d", &x);
in.push_back(x);
}
int root = buildTree(0, n - 1, 0, n - 1);
postOrder(root);
for (int i = 0; i < (int)post.size(); i++) {
printf("%d", post[i]);
if (i < (int)post.size() - 1) {
printf(" ");
}
}
return 0;
}
![](https://i-blog.csdnimg.cn/direct/8de7cd719e534f4fb5c19b83db743a1a.png)
![](https://i-blog.csdnimg.cn/direct/4bfc710ab3cb4a9f9fb11c19907b8c2d.png)
#include <cstdio>
#include <vector>
using namespace std;
const int MAXN = 50;
struct Node {
int l, r;
} nodes[MAXN];
vector<int> pre, in, post;
int buildTree(int postL, int postR, int inL, int inR) {
if (postL > postR) {
return -1;
}
int root = post[postR];
int inIndexOfRoot;
for (int i = inL; i <= inR; i++) {
if (in[i] == root) {
inIndexOfRoot = i;
break;
}
}
int leftCount = inIndexOfRoot - inL;
nodes[root].l = buildTree(postL, postL + leftCount - 1, inL, inIndexOfRoot - 1);
nodes[root].r = buildTree(postL + leftCount, postR - 1, inIndexOfRoot + 1, inR);
return root;
}
void preOrder(int root) {
if (root == -1) {
return;
}
pre.push_back(root);
preOrder(nodes[root].l);
preOrder(nodes[root].r);
}
int main() {
int n, x;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &x);
post.push_back(x);
}
for (int i = 0; i < n; i++) {
scanf("%d", &x);
in.push_back(x);
}
int root = buildTree(0, n - 1, 0, n - 1);
preOrder(root);
for (int i = 0; i < (int)pre.size(); i++) {
printf("%d", pre[i]);
if (i < (int)pre.size() - 1) {
printf(" ");
}
}
return 0;
}
![](https://i-blog.csdnimg.cn/direct/7641e95c216b4fa1a4fa4bf59708955c.png)
![](https://i-blog.csdnimg.cn/direct/229b141c5c9645429c82bc17209ef32b.png)
#include <cstdio>
#include <map>
#include <vector>
using namespace std;
const int MAXN = 50;
struct Node {
int l, r;
} nodes[MAXN];
vector<int> pre, in, layer;
int buildTree(vector<int> layer, int inL, int inR) {
if (layer.empty()) {
return -1;
}
int root = layer[0];
map<int, bool> isLeft;
int inIndexOfRoot;
for (int i = inL; i <= inR; i++) {
if (in[i] == root) {
inIndexOfRoot = i;
break;
} else {
isLeft[in[i]] = true;
}
}
vector<int> leftLayer, rightLayer;
for (int i = 1; i < layer.size(); i++) {
if (isLeft[layer[i]]) {
leftLayer.push_back(layer[i]);
} else {
rightLayer.push_back(layer[i]);
}
}
nodes[root].l = buildTree(leftLayer, inL, inIndexOfRoot - 1);
nodes[root].r = buildTree(rightLayer, inIndexOfRoot + 1, inR);
return root;
}
void preOrder(int root) {
if (root == -1) {
return;
}
pre.push_back(root);
preOrder(nodes[root].l);
preOrder(nodes[root].r);
}
int main() {
int n, x;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &x);
layer.push_back(x);
}
for (int i = 0; i < n; i++) {
scanf("%d", &x);
in.push_back(x);
}
int root = buildTree(layer, 0, n - 1);
preOrder(root);
for (int i = 0; i < (int)pre.size(); i++) {
printf("%d", pre[i]);
if (i < (int)pre.size() - 1) {
printf(" ");
}
}
return 0;
}
![](https://i-blog.csdnimg.cn/direct/0733199fd518455bbafa2bfd39e213f3.png)
![](https://i-blog.csdnimg.cn/direct/afcb7df2f56143a888fc607cf753ffa7.png)
#include <cstdio>
#include <vector>
using namespace std;
const int MAXN = 50;
struct Node {
int data;
int l, r;
} nodes[MAXN];
int treePathSum = 0;
void getTreePathSum(int root, int nodePathSum) {
if (root == -1) {
return;
}
nodePathSum += nodes[root].data;
if (nodes[root].l == -1 && nodes[root].r == -1) {
treePathSum += nodePathSum;
} else {
getTreePathSum(nodes[root].l, nodePathSum);
getTreePathSum(nodes[root].r, nodePathSum);
}
}
int main() {
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &nodes[i].data);
}
for (int i = 0; i < n; i++) {
scanf("%d%d", &nodes[i].l, &nodes[i].r);
}
getTreePathSum(0, 0);
printf("%d", treePathSum);
return 0;
}
![](https://i-blog.csdnimg.cn/direct/0d99698dc5e74042ad62a7e87b90e424.png)
![](https://i-blog.csdnimg.cn/direct/b24e23ab409043909e57b95d5e238a4a.png)
#include <cstdio>
#include <vector>
using namespace std;
const int MAXN = 50;
struct Node {
int data;
int l, r;
} nodes[MAXN];
int treeWeightedPathLength = 0;
void getTreeWeightedPathLength(int root, int nodePathLength) {
if (root == -1) {
return;
}
if (nodes[root].l == -1 && nodes[root].r == -1) {
treeWeightedPathLength += nodes[root].data * nodePathLength;
} else {
nodePathLength++;
getTreeWeightedPathLength(nodes[root].l, nodePathLength);
getTreeWeightedPathLength(nodes[root].r, nodePathLength);
}
}
int main() {
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &nodes[i].data);
}
for (int i = 0; i < n; i++) {
scanf("%d%d", &nodes[i].l, &nodes[i].r);
}
getTreeWeightedPathLength(0, 0);
printf("%d", treeWeightedPathLength);
return 0;
}
9.3树的遍历
![](https://i-blog.csdnimg.cn/direct/629f29c1ae2a4278be8392c1ef678fd2.png)
![](https://i-blog.csdnimg.cn/direct/65b30dbe597844af80a49a5733040902.png)
#include <cstdio>
#include <vector>
using namespace std;
const int MAXN = 50;
struct Node {
vector<int> children;
} nodes[MAXN];
vector<int> pre;
void preOrder(int root) {
pre.push_back(root);
for (int i = 0; i < nodes[root].children.size(); i++) {
preOrder(nodes[root].children[i]);
}
}
int main() {
int n, k, child;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &k);
for (int j = 0; j < k; j++) {
scanf("%d", &child);
nodes[i].children.push_back(child);
}
}
preOrder(0);
for (int i = 0; i < pre.size(); i++) {
printf("%d", pre[i]);
if (i < (int)pre.size() - 1) {
printf(" ");
}
}
return 0;
}
![](https://i-blog.csdnimg.cn/direct/4c901b91e72d425690b65bdd32bbcf3b.png)
![](https://i-blog.csdnimg.cn/direct/afe73ad2d51a453d9e45c8f50a916d51.png)
#include <cstdio>
#include <vector>
using namespace std;
const int MAXN = 50;
struct Node {
vector<int> children;
} nodes[MAXN];
vector<int> post;
void postOrder(int root) {
for (int i = 0; i < nodes[root].children.size(); i++) {
postOrder(nodes[root].children[i]);
}
post.push_back(root);
}
int main() {
int n, k, child;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &k);
for (int j = 0; j < k; j++) {
scanf("%d", &child);
nodes[i].children.push_back(child);
}
}
postOrder(0);
for (int i = 0; i < post.size(); i++) {
printf("%d", post[i]);
if (i < (int)post.size() - 1) {
printf(" ");
}
}
return 0;
}
![](https://i-blog.csdnimg.cn/direct/d53fba6985b24ce683aa4a748b2992f0.png)
![](https://i-blog.csdnimg.cn/direct/7a910440d818410ab914634db3c1b59c.png)
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
const int MAXN = 50;
struct Node {
vector<int> children;
} nodes[MAXN];
vector<int> layer;
void layerOrder(int root) {
queue<int> q;
q.push(root);
while (!q.empty()) {
int front = q.front();
q.pop();
layer.push_back(front);
for (int i = 0; i < nodes[front].children.size(); i++) {
q.push(nodes[front].children[i]);
}
}
}
int main() {
int n, k, child;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &k);
for (int j = 0; j < k; j++) {
scanf("%d", &child);
nodes[i].children.push_back(child);
}
}
layerOrder(0);
for (int i = 0; i < layer.size(); i++) {
printf("%d", layer[i]);
if (i < (int)layer.size() - 1) {
printf(" ");
}
}
return 0;
}
![](https://i-blog.csdnimg.cn/direct/be085b55c90143e4b5a35f03833a8b4f.png)
![](https://i-blog.csdnimg.cn/direct/05b57cd6a7e04d379e5687bad6713909.png)
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
const int MAXN = 50;
struct Node {
int data;
vector<int> children;
} nodes[MAXN];
int treePathSum = 0;
void getTreePathSum(int root, int nodePathSum) {
nodePathSum += nodes[root].data;
if (nodes[root].children.empty()) {
treePathSum += nodePathSum;
}
for (int i = 0; i < nodes[root].children.size(); i++) {
getTreePathSum(nodes[root].children[i], nodePathSum);
}
}
int main() {
int n, k, child;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &nodes[i].data);
}
for (int i = 0; i < n; i++) {
scanf("%d", &k);
for (int j = 0; j < k; j++) {
scanf("%d", &child);
nodes[i].children.push_back(child);
}
}
getTreePathSum(0, 0);
printf("%d", treePathSum);
return 0;
}
![](https://i-blog.csdnimg.cn/direct/b98c145d3d4b4ad1820a01f3496c124f.png)
![](https://i-blog.csdnimg.cn/direct/862c4dbd79b941bba3c51cff10f042b1.png)
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
const int MAXN = 50;
struct Node {
int data;
vector<int> children;
} nodes[MAXN];
int treePathLength = 0;
void getTreePathLength(int root, int edgeCount) {
if (nodes[root].children.empty()) {
treePathLength += nodes[root].data * edgeCount;
}
for (int i = 0; i < nodes[root].children.size(); i++) {
getTreePathLength(nodes[root].children[i], edgeCount + 1);
}
}
int main() {
int n, k, child;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &nodes[i].data);
}
for (int i = 0; i < n; i++) {
scanf("%d", &k);
for (int j = 0; j < k; j++) {
scanf("%d", &child);
nodes[i].children.push_back(child);
}
}
getTreePathLength(0, 0);
printf("%d", treePathLength);
return 0;
}
9.4二叉查找树(BST)
![](https://i-blog.csdnimg.cn/direct/07a9b439ad0c46bbaed3c32e7c8f1483.png)
![](https://i-blog.csdnimg.cn/direct/159ff65d2cae489bbda6f8c1a8eae39e.png)
#include <cstdio>
#include <vector>
using namespace std;
const int MAXN = 50;
struct Node {
int data;
int l, r;
} nodes[MAXN];
int nodeCount = 0;
int newNode(int data) {
nodes[nodeCount].data = data;
nodes[nodeCount].l = nodes[nodeCount].r = -1;
return nodeCount++;
}
int insert(int root, int data) {
if (root == -1) {
return newNode(data);
}
if (data < nodes[root].data) {
nodes[root].l = insert(nodes[root].l, data);
} else {
nodes[root].r = insert(nodes[root].r, data);
}
return root;
}
vector<int> pre;
void preOrder(int root) {
if (root == -1) {
return;
}
pre.push_back(nodes[root].data);
preOrder(nodes[root].l);
preOrder(nodes[root].r);
}
int main() {
int n, data, root = -1;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &data);
root = insert(root, data);
}
preOrder(root);
for (int i = 0; i < (int)pre.size(); i++) {
printf("%d", pre[i]);
if (i < (int)pre.size() - 1) {
printf(" ");
}
}
return 0;
}
![](https://i-blog.csdnimg.cn/direct/b0e1685d948748d38afa51affad12b2f.png)
![](https://i-blog.csdnimg.cn/direct/9ecd400a03c84fc7ac441ccee6fef73b.png)
#include <cstdio>
#include <vector>
using namespace std;
vector<int> in;
bool isBST() {
for (int i = 1; i < in.size(); i++) {
if (in[i] <= in[i - 1]) {
return false;
}
}
return true;
}
int main() {
int n, x;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &x);
in.push_back(x);
}
printf(isBST() ? "Yes" : "No");
return 0;
}
9.5平衡二叉树(AVL树)
![](https://i-blog.csdnimg.cn/direct/8539624d5cab42a88f5b1a3b8e20ae50.png)
![](https://i-blog.csdnimg.cn/direct/af198cb5937f4b1ab915e4b17e21320c.png)
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
const int MAXN = 50;
struct Node {
int data;
int height;
int l, r;
} nodes[MAXN];
int nodeCount = 0;
int newNode(int data) {
nodes[nodeCount].data = data;
nodes[nodeCount].height = 1;
nodes[nodeCount].l = nodes[nodeCount].r = -1;
return nodeCount++;
}
int getHeight(int root) {
if (root == -1) {
return 0;
} else {
return nodes[root].height;
}
}
void updateHeight(int root) {
nodes[root].height = max(getHeight(nodes[root].l), getHeight(nodes[root].r)) + 1;
}
int getBalanceFactor(int root) {
return getHeight(nodes[root].l) - getHeight(nodes[root].r);
}
int insert(int root, int data) {
if (root == -1) {
return newNode(data);
}
if (data < nodes[root].data) {
nodes[root].l = insert(nodes[root].l, data);
} else {
nodes[root].r = insert(nodes[root].r, data);
}
updateHeight(root);
return root;
}
vector<int> balanceFactor;
void inOrder(int root) {
if (root == -1) {
return;
}
inOrder(nodes[root].l);
balanceFactor.push_back(getBalanceFactor(root));
inOrder(nodes[root].r);
}
int main() {
int n, data, root = -1;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &data);
root = insert(root, data);
}
inOrder(root);
for (int i = 0; i < (int)balanceFactor.size(); i++) {
printf("%d", balanceFactor[i]);
if (i < (int)balanceFactor.size() - 1) {
printf(" ");
}
}
return 0;
}
![](https://i-blog.csdnimg.cn/direct/feeb03ee7e684e61827fe81ac5a8b2d8.png)
![](https://i-blog.csdnimg.cn/direct/ca9aa6d529c64fa78a0477b830c21a74.png)
![](https://i-blog.csdnimg.cn/direct/65135ae02f004902a6f4d9dfddf85293.png)
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
const int MAXN = 50;
struct Node {
int data;
int height;
int l, r;
} nodes[MAXN];
int nodeCount = 0;
int newNode(int data) {
nodes[nodeCount].data = data;
nodes[nodeCount].height = 1;
nodes[nodeCount].l = nodes[nodeCount].r = -1;
return nodeCount++;
}
int getHeight(int root) {
if (root == -1) {
return 0;
} else {
return nodes[root].height;
}
}
void updateHeight(int root) {
nodes[root].height = max(getHeight(nodes[root].l), getHeight(nodes[root].r)) + 1;
}
int getBalanceFactor(int root) {
return getHeight(nodes[root].l) - getHeight(nodes[root].r);
}
int insert(int root, int data) {
if (root == -1) {
return newNode(data);
}
if (data < nodes[root].data) {
nodes[root].l = insert(nodes[root].l, data);
} else {
nodes[root].r = insert(nodes[root].r, data);
}
updateHeight(root);
return root;
}
bool isAVL(int root) {
if (root == -1) {
return true;
}
return isAVL(nodes[root].l) && isAVL(nodes[root].r) && abs(getBalanceFactor(root)) <= 1;
}
int main() {
int n, data, root = -1;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &data);
root = insert(root, data);
}
printf(isAVL(root) ? "Yes" : "No");
return 0;
}
![](https://i-blog.csdnimg.cn/direct/4d890c68164240a88cd16aeebaed37f0.png)
![](https://i-blog.csdnimg.cn/direct/52700e862f5244e8b850e3f07441ce58.png)
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
const int MAXN = 50;
struct Node {
int data;
int height;
int l, r;
} nodes[MAXN];
int nodeCount = 0;
int newNode(int data) {
nodes[nodeCount].data = data;
nodes[nodeCount].height = 1;
nodes[nodeCount].l = nodes[nodeCount].r = -1;
return nodeCount++;
}
int getHeight(int root) {
if (root == -1) {
return 0;
} else {
return nodes[root].height;
}
}
void updateHeight(int root) {
nodes[root].height = max(getHeight(nodes[root].l), getHeight(nodes[root].r)) + 1;
}
int getBalanceFactor(int root) {
return getHeight(nodes[root].l) - getHeight(nodes[root].r);
}
int L(int root) {
int temp = nodes[root].r;
nodes[root].r = nodes[temp].l;
nodes[temp].l = root;
updateHeight(root);
updateHeight(temp);
return temp;
}
int R(int root) {
int temp = nodes[root].l;
nodes[root].l = nodes[temp].r;
nodes[temp].r = root;
updateHeight(root);
updateHeight(temp);
return temp;
}
int insert(int root, int data) {
if (root == -1) {
return newNode(data);
}
if (data < nodes[root].data) {
nodes[root].l = insert(nodes[root].l, data);
updateHeight(root);
if (getBalanceFactor(root) == 2) {
if (getBalanceFactor(nodes[root].l) == 1) {
root = R(root);
} else if (getBalanceFactor(nodes[root].l) == -1) {
nodes[root].l = L(nodes[root].l);
root = R(root);
}
}
} else {
nodes[root].r = insert(nodes[root].r, data);
updateHeight(root);
if (getBalanceFactor(root) == -2) {
if (getBalanceFactor(nodes[root].r) == -1) {
root = L(root);
} else if (getBalanceFactor(nodes[root].r) == 1) {
nodes[root].r = R(nodes[root].r);
root = L(root);
}
}
}
return root;
}
vector<int> pre;
void preOrder(int root) {
if (root == -1) {
return;
}
pre.push_back(nodes[root].data);
preOrder(nodes[root].l);
preOrder(nodes[root].r);
}
int main() {
int n, data, root = -1;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &data);
root = insert(root, data);
}
preOrder(root);
for (int i = 0; i < (int)pre.size(); i++) {
printf("%d", pre[i]);
if (i < (int)pre.size() - 1) {
printf(" ");
}
}
return 0;
}
9.6并查集
![](https://i-blog.csdnimg.cn/direct/1c7de69c544349e590bb935072b1ec5e.png)
![](https://i-blog.csdnimg.cn/direct/ce4318abfac84a199c0f4dce21b725d3.png)
#include <cstdio>
#include <cstring>
const int MAXN = 100;
int father[MAXN];
int findFather(int x) {
int xCopy = x;
while (father[x] != x) {
x = father[x];
}
int root = x;
x = xCopy;
while (father[x] != x) {
int fatherX = father[x];
father[x] = root;
x = fatherX;
}
return root;
}
void unionSet(int a, int b) {
int faA = findFather(a);
int faB = findFather(b);
if (faA != faB) {
father[faA] = faB;
}
}
void init(int n) {
for (int i = 0; i < n; i++) {
father[i] = i;
}
}
int main() {
int n, m, a, b;
scanf("%d%d", &n, &m);
init(n);
for (int i = 0; i < m; i++) {
scanf("%d%d", &a, &b);
unionSet(a - 1, b - 1);
}
int classCount = 0;
for (int i = 0; i < n; i++) {
if (father[i] == i) {
classCount++;
}
}
printf("%d", classCount);
return 0;
}
![](https://i-blog.csdnimg.cn/direct/1a376f7234784e51965db997dabd0b45.png)
![](https://i-blog.csdnimg.cn/direct/1160abca651e49caa9301b5258dafbaa.png)
#include <cstdio>
#include <cstring>
const int MAXN = 100;
int father[MAXN];
int findFather(int x) {
int xCopy = x;
while (father[x] != x) {
x = father[x];
}
int root = x;
x = xCopy;
while (father[x] != x) {
int fatherX = father[x];
father[x] = root;
x = fatherX;
}
return root;
}
void unionSet(int a, int b) {
int faA = findFather(a);
int faB = findFather(b);
if (faA != faB) {
father[faA] = faB;
}
}
void init(int n) {
for (int i = 0; i < n; i++) {
father[i] = i;
}
}
int main() {
int n, m, a, b;
scanf("%d%d", &n, &m);
init(n);
for (int i = 0; i < m; i++) {
scanf("%d%d", &a, &b);
unionSet(a - 1, b - 1);
}
bool linked = true;
for (int i = 1; i < n; i++) {
if (findFather(i) != findFather(0)) {
linked = false;
}
}
printf(linked ? "Yes" : "No");
return 0;
}
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
const int MAXN = 100;
int father[MAXN];
int score[MAXN];
vector<int> classes;
int findFather(int x) {
int xCopy = x;
while (father[x] != x) {
x = father[x];
}
int root = x;
x = xCopy;
while (father[x] != x) {
int fatherX = father[x];
father[x] = root;
x = fatherX;
}
return root;
}
void unionSet(int a, int b) {
int faA = findFather(a);
int faB = findFather(b);
if (faA != faB) {
if (score[faA] < score[faB]) {
father[faA] = faB;
} else {
father[faB] = faA;
}
}
}
void init(int n) {
for (int i = 0; i < n; i++) {
father[i] = i;
}
}
int main() {
int n, m, a, b;
scanf("%d%d", &n, &m);
init(n);
for (int i = 0; i < n; i++) {
scanf("%d", &score[i]);
}
for (int i = 0; i < m; i++) {
scanf("%d%d", &a, &b);
unionSet(a - 1, b - 1);
}
for (int i = 0; i < n; i++) {
if (findFather(i) == i) {
classes.push_back(score[i]);
}
}
sort(classes.rbegin(), classes.rend());
printf("%d\n", (int)classes.size());
for (int i = 0; i < classes.size(); i++) {
printf("%d", classes[i]);
if (i < (int)classes.size() - 1) {
printf(" ");
}
}
return 0;
}
![](https://i-blog.csdnimg.cn/direct/7b5c5f6a42714ce4bca9b2fc008628ea.png)
9.7堆
![](https://i-blog.csdnimg.cn/direct/544750ea333d46cdb5eed636afe472c8.png)
![](https://i-blog.csdnimg.cn/direct/c480b762973c47f9ae2a7df53d9cf806.png)
#include <cstdio>
#include <algorithm>
using namespace std;
const int MAXN = 1000 + 1;
int heap[MAXN];
void downAdjust(int low, int high) {
int i = low, j = i * 2;
while (j <= high) {
if (j + 1 <= high && heap[j + 1] > heap[j]) {
j = j + 1;
}
if (heap[j] > heap[i]) {
swap(heap[j], heap[i]);
i = j;
j = i * 2;
} else {
break;
}
}
}
void createHeap(int n) {
for (int i = n / 2; i >= 1; i--) {
downAdjust(i, n);
}
}
int main() {
int n;
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%d", &heap[i]);
}
createHeap(n);
for (int i = 1; i <= n; i++) {
printf("%d", heap[i]);
if (i < n) {
printf(" ");
}
}
return 0;
}
![](https://i-blog.csdnimg.cn/direct/d409c09cd4d54617b3136e4bcfce29a8.png)
#include <cstdio>
#include <algorithm>
using namespace std;
const int MAXN = 1000 + 1;
int heap[MAXN];
void downAdjust(int low, int high) {
int i = low, j = i * 2;
while (j <= high) {
if (j + 1 <= high && heap[j + 1] > heap[j]) {
j = j + 1;
}
if (heap[j] > heap[i]) {
swap(heap[j], heap[i]);
i = j;
j = i * 2;
} else {
break;
}
}
}
void createHeap(int n) {
for (int i = n / 2; i >= 1; i--) {
downAdjust(i, n);
}
}
int deleteTop(int n) {
if (n > 0) {
heap[1] = heap[n--];
downAdjust(1, n);
}
return n;
}
int main() {
int n;
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%d", &heap[i]);
}
createHeap(n);
n = deleteTop(n);
for (int i = 1; i <= n; i++) {
printf("%d", heap[i]);
if (i < n) {
printf(" ");
}
}
return 0;
}
![](https://i-blog.csdnimg.cn/direct/c2a755ea7ffb4702acfa26bc2ab2c410.png)
#include <cstdio>
#include <algorithm>
using namespace std;
const int MAXN = 50 + 1;
int heap[MAXN];
void downAdjust(int low, int high) {
int i = low, j = i * 2;
while (j <= high) {
if (j + 1 <= high && heap[j + 1] > heap[j]) {
j = j + 1;
}
if (heap[j] > heap[i]) {
swap(heap[j], heap[i]);
i = j;
j = i * 2;
} else {
break;
}
}
}
void createHeap(int n) {
for (int i = n / 2; i >= 1; i--) {
downAdjust(i, n);
}
}
void heapSort(int n) {
createHeap(n);
for (int i = n; i > 1; i--) {
swap(heap[i], heap[1]);
downAdjust(1, i - 1);
}
}
int main() {
int n;
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%d", &heap[i]);
}
heapSort(n);
for (int i = 1; i <= n; i++) {
printf("%d", heap[i]);
if (i < n) {
printf(" ");
}
}
return 0;
}
9.8哈夫曼树
![](https://i-blog.csdnimg.cn/direct/94c8cf1f97f34f80990955367a92823d.png)
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int minCostToMergeFruits(vector<int>& fruits) {
// 使用优先队列(最小堆)来处理
priority_queue<int, vector<int>, greater<int>> minHeap(fruits.begin(), fruits.end());
int totalCost = 0;
// 当堆中还有超过一个元素时,进行合并操作
while (minHeap.size() > 1) {
// 取出最小的两个果堆
int first = minHeap.top();
minHeap.pop();
int second = minHeap.top();
minHeap.pop();
// 合并这两个果堆
int mergedCost = first + second;
totalCost += mergedCost;
// 将新的合并后的果堆放回堆中
minHeap.push(mergedCost);
}
return totalCost;
}
int main() {
int n;
cin >> n;
vector<int> fruits(n);
for (int i = 0; i < n; ++i) {
cin >> fruits[i];
}
int result = minCostToMergeFruits(fruits);
cout << result << endl;
return 0;
}
![](https://i-blog.csdnimg.cn/direct/a1da64a338054f31a825be2ac43f0b65.png)
#include <cstdio>
#include <queue>
using namespace std;
priority_queue<int, vector<int>, greater<int> > pq;
int main() {
int n, weight;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &weight);
pq.push(weight);
}
int ans = 0;
while (pq.size() > 1) {
int top1 = pq.top();
pq.pop();
int top2 = pq.top();
pq.pop();
pq.push(top1 + top2);
ans += top1 + top2;
}
printf("%d", ans);
return 0;
}
![](https://i-blog.csdnimg.cn/direct/1e9ebe53f85d4ecba0cfc1d3b73d3da8.png)
#include <iostream>
#include <string>
#include <queue>
using namespace std;
const int MAXC = 26;
int charCnt[MAXC] = {0};
priority_queue<int, vector<int>, greater<int> > pq;
int main() {
string s;
cin >> s;
for (int i = 0; i < s.length(); i++) {
charCnt[s[i] - 'A']++;
}
for (int i = 0; i < MAXC; i++) {
if (charCnt[i] > 0) {
pq.push(charCnt[i]);
}
}
int ans = 0;
while (pq.size() > 1) {
int top1 = pq.top();
pq.pop();
int top2 = pq.top();
pq.pop();
pq.push(top1 + top2);
ans += top1 + top2;
}
printf("%d", ans);
return 0;
}