问题描述 :
目的:使用C++模板设计并逐步完善二叉树的抽象数据类型(ADT)。
内容:
(1)请参照链表的ADT模板,设计二叉树并逐步完善的抽象数据类型。(由于该环境目前仅支持单文件的编译,故将所有内容都集中在一个源文件内。在实际的设计中,推荐将抽象类及对应的派生类分别放在单独的头文件中。参考教材、课件,以及网盘中的链表ADT原型文件,自行设计二叉树的ADT。)
注意:二叉树ADT的基本操作的算法设计很多要用到递归的程序设计方法。
(2)基本操作11:在二叉树的二叉链表存储形式建立的基础上,使用递归的程序设计方法,设计并完成删除以元素值x为根结点的(子)树的算法。完成后将其加入到二叉树的ADT基本操作集中。
初始条件:二叉树T存在,x是T中某个结点。
操作结果:若x是T的结点,且子树存在,则根据参数选择删除对应的子树(flag=0,删除左子树;flag=1,删除右子树)。删除成功,返回true;否则返回false。
参考函数原型:
(1)删除以元素值x为根结点的(子)树(外壳部分,用户函数)
//删除以元素值x为根结点的(子)树(flag=0,左子树;flag=1,右子树)
template
bool DeleteChild(BinaryTree &T, ElemType &x, int flag);
(2)删除以元素值x为根结点的(子)树(递归部分,成员函数)
//删除以元素值x为根结点的(子)树(flag=0,左子树;flag=1,右子树)
template
bool BinaryTree::ChildTreeDestroy(BinaryTreeNode *root, int flag);
(3)辅助函数1:查找元素值为x的结点的位置(参见基本操作8)
(4)辅助函数2:销毁树(递归部分,参见基本操作6)
输入说明 :
第一行:表示无孩子或指针为空的特殊分隔符
第二行:二叉树的先序序列(结点元素之间以空格分隔)
第三行:元素值x
第四行:flag值(0或1)
输出说明 :
删除成功:
第一行:true
第二行:删除后树的前序遍历结果
第三行:删除后树的中序遍历结果
第四行:删除后树的后序遍历结果
删除失败:
第一行:false
第二行:原树的前序遍历结果
第三行:原树的中序遍历结果
第四行:原树的后序遍历结果
输入范例 :
#
A B # C D # # E # # F # G # H # #
C
1
输出范例 :
true
A B C D F G H
B D C A F G H
D C B H G F A
解题代码:
// tree.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include