1. DS二叉树–二叉树构建与遍历
题目描述
给定一颗二叉树的逻辑结构如下图,(先序遍历的结果,空树用字符‘0’表示,例如AB0C00D00),建立该二叉树的二叉链式存储结构,并输出该二叉树的先序遍历、中序遍历和后序遍历结果
本题目的代码框架参考如下
三种遍历的代码框架
主函数如下:
输入
第一行输入一个整数t,表示有t个二叉树
第二行起输入每个二叉树的先序遍历结果,空树用字符‘0’表示,连续输入t行
输出
输出每个二叉树的先序遍历、中序遍历和后序遍历结果
输入样例
2
AB0C00D00
AB00C00
输出样例
ABCD
BCAD
CBDA
ABC
BAC
BCA
参考代码
#include <iostream> using namespace std; class treenode { public: char data; treenode *left; treenode *right; treenode() { data = '0'; left = NULL; right = NULL; } }; class tree { public: void create(treenode *&p) { char word; cin >> word; if (word != '0') { p = new treenode(); p->data = word; create(p->left); create(p->right); } else { p = NULL; } } void preorder(treenode *p) { if (p != NULL) { cout << p->data; preorder(p->left); preorder(p->right); } } void inorder(treenode *p) { if (p != NULL) { inorder(p->left); cout << p->data; inorder(p->right); } } void postorder(treenode *p) { if (p != NULL) { postorder(p->left); postorder(p->right); cout << p->data; } } }; int main() { int t; cin >> t; while (t--) { tree p; treenode *root; p.create(root); p.preorder(root); cout << endl; p.inorder(root); cout << endl; p.postorder(root); cout << endl; } }
2. DS二叉树–叶子数量
题目描述
计算一颗二叉树包含的叶子结点数量。
提示:叶子是指它的左右孩子为空。
建树方法采用“先序遍历+空树用0表示”的方法,即给定一颗二叉树的先序遍历的结果为AB0C00D00,其中空节点用字符‘0’表示。则该树的逻辑结构如下图。
输入
第一行输入一个整数t,表示有t个测试数据
第二行起输入二叉树先序遍历的结果,空树用字符‘0’表示,输入t行
输出
逐行输出每个二叉树的包含的叶子数量
输入样例
3
AB0C00D00
AB00C00
ABC00D00E00
输出样例
2
2
3
参考代码
#include <iostream> using namespace std; class treenode { public: char data; treenode *left; treenode *right; treenode() { data = '0'; left = NULL; right = NULL; } }; class tree { public: int count = 0; void create(treenode *&p) { char word; cin >> word; if (word != '0') { p = new treenode(); p->data = word; create(p->left); create(p->right); } else { p = NULL; } } int preorder(treenode *p) { if (p != NULL) { if (p->left == NULL && p->right == NULL) count++; else { preorder(p->left); preorder(p->right); } } return count; } void inorder(treenode *p) { if (p != NULL) { inorder(p->left); cout << p->data; inorder(p->right); } } void postorder(treenode *p) { if (p != NULL) { postorder(p->left); postorder(p->right); cout << p->data; } } }; int main() { int t; cin >> t; while (t--) { tree p; treenode *root; p.create(root); cout << p.preorder(root); cout << endl; } }
3. DS二叉树——二叉树之父子结点
题目描述
给定一颗二叉树的逻辑结构如下图,(先序遍历的结果,空树用字符‘0’表示,例如AB0C00D00),建立该二叉树的二叉链式存储结构。
编写程序输出该树的所有叶子结点和它们的父亲结点
输入
第一行输入一个整数t,表示有t个二叉树
第二行起,按照题目表示的输入方法,输入每个二叉树的先序遍历,连续输入t行
输出
第一行按先序遍历,输出第1个示例的叶子节点
第二行输出第1个示例中与叶子相对应的父亲节点
以此类推输出其它示例的结果
输入样例
3
AB0C00D00
AB00C00
ABCD0000EF000
输出样例
C D
B A
B C
A A
D F
C E
参考代码
#include <iostream> #include <queue> using namespace std; class treenode { public: char data; treenode *left; treenode *right; treenode() { data = '0'; left = NULL; right = NULL; } }; class tree { public: queue<treenode *> leaves; queue<treenode *> pres; void create(treenode *&p) { char word; cin >> word; if (word != '0') { p = new treenode(); p->data = word; create(p->left); create(p->right); } else { p = NULL; } } void preorder(treenode *p) { preordermethod(p, NULL); while (!leaves.empty()) { cout << leaves.front()->data << " "; leaves.pop(); } cout << endl; while (!pres.empty()) { cout << pres.front()->data << " "; pres.pop(); } cout << endl; } void preordermethod(treenode *leave, treenode *pre) { if (leave != NULL) { if (leave->left == NULL && leave->right == NULL) { leaves.push(leave); pres.push(pre); } else { preordermethod(leave->left, leave); preordermethod(leave->right, leave); } } } void inorder(treenode *p) { if (p != NULL) { inorder(p->left); cout << p->data; inorder(p->right); } } void postorder(treenode *p) { if (p != NULL) { postorder(p->left); postorder(p->right); cout << p->data; } } }; int main() { int t; cin >> t; while (t--) { tree p; treenode *root; p.create(root); p.preorder(root); } }
4. DS树–二叉树高度
题目描述
给出一棵二叉树,求它的高度。二叉树的创建采用前面实验的方法。
注意,二叉树的层数是从1开始
输入
第一行输入一个整数t,表示有t个二叉树
第二行起输入每个二叉树的先序遍历结果,空树用字符‘0’表示,连续输入t行
输出
每行输出一个二叉树的高度
输入样例
1
AB0C00D00
输出样例
3
参考代码
#include <iostream> using namespace std; class treenode { public: char data; treenode *left; treenode *right; treenode() { data = '0'; left = NULL; right = NULL; } }; class tree { public: int count = 0; void create(treenode *&p) { char word; cin >> word; if (word != '0') { p = new treenode(); p->data = word; create(p->left); create(p->right); } else { p = NULL; } } int preorder(treenode *p, int num) { if (p != NULL) { if (p->left == NULL && p->right == NULL && num > count) { count = num; } else { preorder(p->left, num + 1); preorder(p->right, num + 1); } } return count; } void inorder(treenode *p) { if (p != NULL) { inorder(p->left); cout << p->data; inorder(p->right); } } void postorder(treenode *p) { if (p != NULL) { postorder(p->left); postorder(p->right); cout << p->data; } } }; int main() { int t; cin >> t; while (t--) { tree p; treenode *root; p.create(root); cout << p.preorder(root, 1); cout << endl; } }
5. 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
参考代码
#include <iostream> #include <queue> using namespace std; class treenode { public: int data; treenode *left; treenode *right; }; class tree { public: void create(treenode *&p) { int word; cin >> word; if (word != 0) { p = new treenode(); p->data = word; create(p->left); create(p->right); } else { p = NULL; } } void levelcreate(treenode *&p, int num) { queue<treenode *> l; int count = 0; int data; cin >> data; count++; if (data) { p = new treenode(); p->data = data; l.push(p); } else { p = NULL; } while (!l.empty() && count < num) { treenode *node = l.front(); cin >> data; int flag = 0; count++; if (data) { node->left = new treenode(); node->left->data = data; l.push(node->left); flag = 1; } else { node->left = NULL; } cin >> data; count++; if (data) { node->right = new treenode(); node->right->data = data; l.push(node->right); flag = 1; } else { node->right = NULL; } if (flag) l.pop(); } } void preorder(treenode *p) { if (p != NULL) { cout << p->data << " "; preorder(p->left); preorder(p->right); } } }; int main() { int t; cin >> t; while (t--) { tree p; treenode *root; int num; cin >> num; p.levelcreate(root, num); p.preorder(root); cout << endl; } }