上海的同学们被关着是不是很难过,我错过了新蝙蝠侠的电影!!!!
但我最近找到资源了 你们用某雷下就行了,算是给封校的期间增添一点快乐。我爱DC。
magnet:?xt=urn:btih:14f7d9d66f37e92bd42251c97c146b4c17aa044e&dn=%e9%98%b3%e5%85%89%e7%94%b5%e5%bd%b1www.ygdy8.com.%e6%96%b0%e8%9d%99%e8%9d%a0%e4%be%a0.2022.HD.1080P.%e4%b8%ad%e8%8b%b1%e5%8f%8c%e5%ad%97.mkv&tr=udp%3a%2f%2ftracker.opentrackr.org%3a1337%2fannounce&tr=udp%3a%2f%2fexodus.desync.com%3a6969%2fannounce
复制到某雷下载就可以了 懂得都懂
15 二叉树:左右互换
作者: 冯向阳时间限制: 1S章节: DS:树
截止日期: 2022-06-30 23:55:00
问题描述 :
目的:使用C++模板设计二叉树的抽象数据类型(ADT)。并在此基础上,使用二叉树ADT的基本操作,设计并实现简单应用的算法设计。
内容:(1)请参照链表的ADT模板,设计二叉树的抽象数据类型。(由于该环境目前仅支持单文件的编译,故将所有内容都集中在一个源文件内。在实际的设计中,推荐将抽象类及对应的派生类分别放在单独的头文件中。参考教材、课件,以及网盘中的链表ADT原型文件,自行设计二叉树的ADT。)
注意:二叉树ADT的基本操作的算法设计很多要用到递归的程序设计方法。
(2)ADT的简单应用:使用该ADT设计并实现若干应用二叉树的算法设计。
应用3:要求设计一个递归算法,将二叉树中所有结点左、右子树相互交换。二叉树的存储结构的建立参见二叉树应用1。
参考函数原型:
//交换二叉树中所有结点的左右子树 (外壳)
template<class ElemType>
void BinaryTree_Revolute( BinaryTree<ElemType> &T );
//交换二叉树中所有结点的左右子树 (递归)
template<class ElemType>
void BinaryTree_Revolute_Cursive( BinaryTreeNode<ElemType> *root);
输入说明 :
第一行:表示无孩子或指针为空的特殊分隔符
第二行:二叉树的先序序列(结点元素之间以空格分隔)
输出说明 :
第一行:二叉树先序遍历结果
第二行:二叉树中序遍历结果
第三行:二叉树后序遍历结果
第四行:空行
第五行:转换后二叉树先序遍历结果
第六行:转换后二叉树中序遍历结果
第七行:转换后二叉树后序遍历结果
-------------------------------------------------------
#
A B D # # E G # # H # # C # F I # J # # #
---------------------------------------------------------
输出范例 :
A,B,D,E,G,H,C,F,I,J
D,B,G,E,H,A,C,I,J,F
D,G,H,E,B,J,I,F,C,A
A,C,F,I,J,B,E,H,G,D
F,J,I,C,A,H,E,G,B,D
J,I,F,C,H,G,E,D,B,A
#include<iostream>
using namespace std;
int m = 0;
int m1 = 0;
int m2 = 0;
struct student
{
string data;
student* left;
student* right;
};
void creat(student*& T, string kk)
{
string ch;
cin >> ch;
if (ch == kk)
{
T = NULL;
}//但凡输入了#号 该节点下一位停止
else
{
T = new student;
T->data = ch;
creat(T->left, kk);
creat(T->right, kk);
}
}
void prescan(student* root)
{
if (root == NULL)
return;
else
{
if (m == 1)
{
cout << ',';
}
cout << root->data;
m = 1;
prescan(root->left);
prescan(root->right);
}
}
void midscan(student* root)
{
if (root == NULL)
return;
else
{
midscan(root->left);
if (m1 == 1)
{
cout << ',';
}
cout << root->data;
m1 = 1;
midscan(root->right);
}
}
void lastscan(student* root)
{
if (root == NULL)
return;
else
{
lastscan(root->left);
lastscan(root->right);
if (m2 == 1)
{
cout << ',';
}
cout << root->data;
m2 = 1;
}
}
void change(student*& root)//递归转换二叉树部分 需要思考一下 不过这个递归比较容易理解 跟前面的几个prescan midscan递归很像
{
if (root == NULL)
return;
else
{
student* t = root->left;
root->left = root->right;
root->right = t;
change(root->right);//这是sentence 1
change(root->left);//这是sentence 2
//上面两步你的顺序写成1,2或者2,1都可以 随意调换顺序
}
}
int main()
{
student* root;
string kk;
cin >> kk;
creat(root, kk);
prescan(root);
cout << endl;
midscan(root);
cout << endl;
lastscan(root);
cout << endl;
m = 0;
m1 = 0;
m2 = 0;
change(root);
cout << endl;
prescan(root);
cout << endl;
midscan(root);
cout << endl;
lastscan(root);
cout << endl;
return 0;
}