特殊二叉树
原题链接:67324.4.0U5笔记合集2025-10-25 16:33:36
发布于:江苏
一. 上节课作业
T2.
#include<bits/stdc++.h>
using namespace std;
//处理前序遍历为s,中序遍历为t的字串
void dfs1(string s, string t) {
if (s.size() == 0) return;
int id = t.find(s[0]);//找到前序遍历的第一个字符(根节点)在中序遍历中的位置
dfs1(s.substr(1, id), t.substr(0, id));//前序遍历的左子树是从下标1开始的id个字符,中序遍历的左子树是从下标0开始的id个字符
dfs1(s.substr(id + 1, s.size() - id - 1), t.substr(id + 1, s.size() - id - 1));//前序遍历的右子树是从下标id+1开始的s.size() - id - 1个字符,中序遍历的右子树是从下标id+1开始的s.size() - id - 1个字符
cout << s[0];
}
//处理中序遍历为s,后序遍历为t的字串
void dfs2(string s, string t) {
if (s.size() == 0) return;
int id = s.find(t.back());//找到后序遍历的最后一个字符(根节点)在中序遍历中的位置
cout << s[id];//先输出,再递归左子树,再递归右子树
dfs2(s.substr(0, id), t.substr(0, id));//中序遍历的左子树是从下标0开始的id个字符,后序遍历的左子树是从下标0开始的id个字符
dfs2(s.substr(id + 1, s.size() - id - 1), t.substr(id, s.size() - id - 1));//中序遍历的右子树是从下标id+1开始的s.size() - id - 1个字符,后序遍历的右子树是从下标id开始的s.size() - id - 1个字符
}
int main() {
int _;
cin >> _;
while (_--) {
int opt;
string s, t;
cin >> opt >> s >> t;
if (opt == 1) {
dfs1(s, t);
}
else {
dfs2(s, t);
}
cout << '\n';
}
return 0;
}
二. 完全二叉树的叶子节点
#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
struct node{
int v, l, r;
void in(){
cin>>v>>l>>r;
}
}a[N];
int n;
void preOrder(int rt){
if (a[rt].l==0 && a[rt].r==0){
cout << a[rt].v << ' '; //输出根结点的value
}else{
if (a[rt].l) preOrder(a[rt].l);
if (a[rt].r) preOrder(a[rt].r);
}
}
int main(){
cin >> n;
for (int i=1; i<=n; i++) a[i].in(); //成员方法,成员函数
preOrder(1);
// gameOverFirst //小驼峰命名法
// GameOverFirst //大驼峰命名法
// game_over_first //蛇形命名法
return 0;
}
三. BST

四. 哈夫曼树

这里空空如也








有帮助,赞一个