树专题整理(未完结)
作者:互联网
A. DS二叉树–二叉树构建与遍历
题目描述
给定一颗二叉树的逻辑结构如下图,(先序遍历的结果,空树用字符‘0’表示,例如AB0C00D00),建立该二叉树的二叉链式存储结构,并输出该二叉树的先序遍历、中序遍历和后序遍历结果
输入
第一行输入一个整数t,表示有t个二叉树
第二行起输入每个二叉树的先序遍历结果,空树用字符‘0’表示,连续输入t行
输出
输出每个二叉树的先序遍历、中序遍历和后序遍历结果
输入样例
2
AB0C00D00
AB00C00
输出样例
ABCD
BCAD
CBDA
ABC
BAC
BCA
C++ 代码
#include <iostream>
using namespace std;
string str;
int pos;
struct TreeNode{
char val;
TreeNode* left;
TreeNode* right;
TreeNode():left(NULL), right(NULL){}
TreeNode(char ch):val(ch), left(NULL), right(NULL){}
};
TreeNode* make_tree(TreeNode* h){
char ch = str[pos++];
if (ch == '0') return NULL;
else {
h = new TreeNode(ch);
h->left = make_tree(h->left);
h->right = make_tree(h->right);
}
return h;
}
void PreOrder(TreeNode* h){
cout << h->val;
if (h->left) PreOrder(h->left);
if (h->right) PreOrder(h->right);
}
void InOrder(TreeNode* h){
if (h->left) InOrder(h->left);
cout << h->val;
if (h->right) InOrder(h->right);
}
void PosOrder(TreeNode* h){
if (h->left) PosOrder(h->left);
if (h->right) PosOrder(h->right);
cout << h->val;
}
int main(){
int t;
cin >> t;
while (t--){
TreeNode* head;
cin >> str;
pos = 0;
head = make_tree(head);
PreOrder(head);
cout << endl;
InOrder(head);
cout << endl;
PosOrder(head);
cout << endl;
}
return 0;
}
B. DS二叉树–叶子数量
题目描述
计算一颗二叉树包含的叶子结点数量。
提示:叶子是指它的左右孩子为空。
建树方法采用“先序遍历+空树用0表示”的方法,即给定一颗二叉树的先序遍历的结果为AB0C00D00,其中空节点用字符‘0’表示。则该树的逻辑结构如下图。
输入
第一行输入一个整数t,表示有t个测试数据
第二行起输入二叉树先序遍历的结果,空树用字符‘0’表示,输入t行
输出
逐行输出每个二叉树的包含的叶子数量
输入样例
3
AB0C00D00
AB00C00
ABC00D00E00
输出样例
2
2
3
C++ 代码
#include <iostream>
using namespace std;
string str;
int pos;
int ans;
struct TreeNode{
char val;
TreeNode* left;
TreeNode* right;
TreeNode():left(NULL), right(NULL){}
TreeNode(char ch):val(ch), left(NULL), right(NULL){}
};
TreeNode* make_tree(TreeNode* h){
char ch = str[pos++];
if (ch == '0') return NULL;
else {
h = new TreeNode(ch);
h->left = make_tree(h->left);
h->right = make_tree(h->right);
}
return h;
}
void PreOrder(TreeNode* h){
if (h->left) PreOrder(h->left);
if (h->right) PreOrder(h->right);
if (!h->left && !h->right) ans++;
}
int main(){
int t;
cin >> t;
while (t--){
ans = 0;
TreeNode* head;
cin >> str;
pos = 0;
head = make_tree(head);
PreOrder(head);
cout << ans;
cout << endl;
}
return 0;
}
C. DS二叉树——二叉树之父子结点
题目描述
给定一颗二叉树的逻辑结构如下图,(先序遍历的结果,空树用字符‘0’表示,例如AB0C00D00),建立该二叉树的二叉链式存储结构。
编写程序输出该树的所有叶子结点和它们的父亲结点
输入
第一行输入一个整数t,表示有t个二叉树
第二行起,按照题目表示的输入方法,输入每个二叉树的先序遍历,连续输入t行
输出
第一行按先序遍历,输出第1个示例的叶子节点
第二行输出第1个示例中与叶子相对应的父亲节点
以此类推输出其它示例的结果
输入样例
3
AB0C00D00
AB00C00
ABCD0000EF000
输出样例
C D
B A
B C
A A
D F
C E
C++ 代码
#include <iostream>
using namespace std;
string str;
string son, fa;
int pos;
int ans;
struct TreeNode{
char val;
TreeNode* left;
TreeNode* right;
TreeNode():left(NULL), right(NULL){}
TreeNode(char ch):val(ch), left(NULL), right(NULL){}
};
TreeNode* make_tree(TreeNode* h){
char ch = str[pos++];
if (ch == '0') return NULL;
else {
h = new TreeNode(ch);
h->left = make_tree(h->left);
h->right = make_tree(h->right);
}
return h;
}
void PreOrder(TreeNode* h){
if (h->left){
if (!h->left->left && !h->left->right){
fa += h->val;
son += h->left->val;
}
PreOrder(h->left);
}
if (h->right){
if (!h->right->left && !h->right->right){
fa += h->val;
son += h->right->val;
}
PreOrder(h->right);
}
}
int main(){
int t;
cin >> t;
while (t--){
son.clear();
fa.clear();
ans = 0;
TreeNode* head;
cin >> str;
pos = 0;
head = make_tree(head);
PreOrder(head);
for (int i = 0; son[i]; ++i) cout << son[i] << " ";
cout << endl;
for (int i = 0; fa[i]; ++i) cout << fa[i] << " ";
cout << endl;
}
return 0;
}
D. DS树–二叉树高度
题目描述
给出一棵二叉树,求它的高度。二叉树的创建采用前面实验的方法。
注意,二叉树的层数是从1开始
输入
第一行输入一个整数t,表示有t个二叉树
第二行起输入每个二叉树的先序遍历结果,空树用字符‘0’表示,连续输入t行
输出
每行输出一个二叉树的高度
输入样例
1
AB0C00D00
输出样例
3
C++ 代码
#include <iostream>
using namespace std;
string str;
int pos;
int high;
struct TreeNode{
char val;
TreeNode* left;
TreeNode* right;
TreeNode():left(NULL), right(NULL){}
TreeNode(char ch):val(ch), left(NULL), right(NULL){}
};
TreeNode* make_tree(TreeNode* h){
char ch = str[pos++];
if (ch == '0') h = NULL;
else {
h = new TreeNode(ch);
h->left = make_tree(h->left);
h->right = make_tree(h->right);
}
return h;
}
void Level(TreeNode* h){
TreeNode* q[100];
int hh = 0, tt = -1;
q[++tt] = h;
while (hh <= tt){
int sz = tt-hh + 1;
while (sz--){
auto t = q[hh++];
if (t->left) q[++tt] = t->left;
if (t->right) q[++tt] = t->right;
}
high++;
}
}
int main(){
int t;
cin >> t;
while (t--){
cin >> str;
pos = 0;
high = 0;
TreeNode* head = make_tree(head);
Level(head);
cout << high << endl;
}
return 0;
}
E. DS二叉树——二叉树之数组存储
题目描述
二叉树可以采用数组的方法进行存储,把数组中的数据依次自上而下,自左至右存储到二叉树结点中,一般二叉树与完全二叉树对比,比完全二叉树缺少的结点就在数组中用0来表示。,如下图所示
从上图可以看出,右边的是一颗普通的二叉树,当它与左边的完全二叉树对比,发现它比完全二叉树少了第5号结点,所以在数组中用0表示,同样它还少了完全二叉树中的第10、11号结点,所以在数组中也用0表示。
结点存储的数据均为非负整数
输入
第一行输入一个整数t,表示有t个二叉树
第二行起,每行输入一个数组,先输入数组长度,再输入数组内数据,每个数据之间用空格隔开,输入的数据都是非负整数
连续输入t行
输出
每行输出一个示例的先序遍历结果,每个结点之间用空格隔开
输入样例
3
3 1 2 3
5 1 2 3 0 4
13 1 2 3 4 0 5 6 7 8 0 0 9 10
输出样例
1 2 3
1 2 4 3
1 2 4 7 8 3 5 9 10 6
提示
注意从数组位置和二叉树深度、结点位置进行关联,或者父子结点在数组中的位置存在某种管理,例如i, i+1, i/2, i+1/2…或者2i, 2i+1…仔细观察哦
C++ 代码
#include <iostream>
using namespace std;
const int N = 1e5+10;
int n;
int nums[N];
struct TreeNode{
int val;
TreeNode* left;
TreeNode* right;
TreeNode():val(-1), left(NULL), right(NULL){}
TreeNode(int x):val(x), left(NULL), right(NULL){}
};
TreeNode* make_tree(int u){
TreeNode* t;
if (nums[u] == 0) t = NULL;
else {
t = new TreeNode(nums[u]);
if (2*u <= n) t->left = make_tree(2*u);
if (2*u+1 <= n) t->right = make_tree(2*u+1);
}
return t;
}
void PreOrder(TreeNode* h){
cout << h->val << " ";
if (h->left) PreOrder(h->left);
if (h->right) PreOrder(h->right);
}
int main(){
int t;
cin >> t;
while (t--){
cin >> n;
for (int i = 1; i <= n; ++i) cin >> nums[i];
TreeNode* head;
head = make_tree(1);
PreOrder(head);
cout << endl;
}
return 0;
}
标签:right,TreeNode,未完结,int,专题,二叉树,整理,NULL,left 来源: https://blog.csdn.net/weixin_50325452/article/details/122028882