如果有学弟学妹做不出来实验二的 可以参考下 尽量自己做
这一节的实验大多都是用的递归的思想
二叉树很重要 必须要掌握他 后面的图也会用到二叉树的基础知识
大家问的比较多的问题我后面有时间就写个总结 祝学弟学妹 学业有成 天天开心
满二叉树的判断
template <class ElemType>
bool IsFullTree(const BinaryTree<ElemType> &bt)
// 操作结果: 判断二叉树bt是否是满二叉树
{
int h = bt.Height();
int n = bt.NodeCount();
if (fabs(pow(2.0, h) - 1 - n) < 1e-2)
return true;
else
return false;
}
完全二叉树判断
template <class ElemType>
bool IsCompleteTree(const BinaryTree<ElemType> &bt)
// 操作结果: 判断二叉树bt是否是完全二叉树
{
const BinTreeNode<ElemType> *r = bt.GetRoot();
if (r != NULL)
{ // 非空二叉树
const BinTreeNode<ElemType> *p; // 工作变量
LinkQueue<const BinTreeNode<ElemType> *> q; // 队列
q.InQueue(r); // 根入队
while(!q.Empty())
{ // 队列非空
q.OutQueue(p); //出队操作
if (p != NULL)
{ // 空非指针
q.InQueue(p->leftChild); //当前结点非空,左孩子指针入队
q.InQueue(p->rightChild); //当前结点非空,则右孩子指针入队
}
else
{ // 当前指针为空,判断队列是否所有指针都为空
while(!q.Empty())
{ // 队列非空
q.OutQueue(p); // 出队操作
if ( p!= NULL)
{ // 非空指针
return false; // 队列中出现非空指针,为非完全二叉树
}
}
return true; // 队列中的所有指针为空,为完全二叉树
}
}
}
else
{ // 空二叉树
return true; // 空队列是特殊的完全二叉树
}
}
相似二叉树判断
template <class ElemType>
bool IsSimilarHelp(const BinTreeNode<ElemType> *r1, const BinTreeNode<ElemType> *r2)
// 操作结果: 判断以r1和r2为根的两棵二叉树是否相似
{
if (r1 == NULL || r2 == NULL)
return (r1 == NULL) && (r2 == NULL);
return IsSimilarHelp(r1->leftChild, r2->leftChild) && IsSimilarHelp(r1->rightChild, r2->rightChild);
}
template <class ElemType>
bool IsSimilar(const BinaryTree<ElemType> &bt1, const BinaryTree<ElemType> &bt2)
// 操作结果: 判断两棵二叉树是否相似
{
return IsSimilarHelp(bt1.GetRoot(), bt2.GetRoot());
}
二叉树结点交换
template <class ElemType>
void SwapBiTreeHelp(BinTreeNode<ElemType> *r)
// 操作结果: 交换以r为根的二叉树的所有结点的左右孩子
{
if (r != NULL)
{ // 非空二叉树
//交换根结点的左右孩子
BinTreeNode<ElemType> *p; // 工作指针
p = r->leftChild; r->leftChild = r->rightChild; r->rightChild = p;// 循环赋值交换左右孩子
SwapBiTreeHelp(r->leftChild); // 交换左子树的所有结点的左右孩子
SwapBiTreeHelp(r->rightChild); // 交换右子树的所有结点的左右孩子
}
}
template <class ElemType>
void SwapBiTree(BinaryTree<ElemType> &bt)
// 操作结果: 交换二叉树的所有结点的左右孩子
{
SwapBiTreeHelp((BinTreeNode<ElemType> *)bt.GetRoot()); // 调用辅助函数实现交换二叉树的所有结点的左右孩子
}
统计叶结点个数
template <class ElemType>
int LeafNodeCountHelp(const BinTreeNode<ElemType> *r)
// 操作结果: 统计以r为根的二叉树的叶结点个数
{
if (r == NULL)
return 0;
else if(r->leftChild == NULL && r->rightChild == NULL)
return 1;
else
return LeafNodeCountHelp(r->leftChild) + LeafNodeCountHelp(r->rightChild);
}
template <class ElemType>
int LeafNodeCount(BinaryTree<ElemType> bt)
// 操作结果: 统计二叉树的叶结点个数
{
return LeafNodeCountHelp(bt.GetRoot()); // 调用辅助函数统计二叉树的叶结点个数
}
构造二叉树
template <class ElemType>
void CreateBinaryTreeHelp_PostIn(BinTreeNode<ElemType> *&r, ElemType post[], ElemType in[],
int postLeft, int postRight, int inLeft, int inRight)
// 操作结果:已知二叉树的后序序列post[postLeft..postRight]和中序序列in[inLeft..inRight]构造
// 以r为根的二叉树
{
if (postLeft > postRight || inLeft > inRight)
{ // 二叉树无结点,空二叉树
r = NULL; // 空二叉树根为空
}
else
{ // 二叉树有结点,非空二叉树
r = new BinTreeNode<ElemType>(post[postRight]);// 生成根结点
int mid = inLeft;
while (in[mid] != post[postRight])
{
mid++;
}
CreateBinaryTreeHelp_PostIn(r->leftChild, post, in, postLeft, postLeft + mid - inLeft - 1, inLeft, mid - 1);
CreateBinaryTreeHelp_PostIn(r->rightChild, post, in, postLeft + mid - inLeft, postRight - 1, mid + 1, inRight);
}
}
template <class ElemType>
BinaryTree<ElemType> CreateBinaryTree_PostIn(ElemType post[], ElemType in[], int n)
// 操作结果:已知后序和中序序列构造二叉树
{
BinTreeNode<ElemType> *r; // 二叉树的根
CreateBinaryTreeHelp_PostIn<ElemType>(r, post, in, 0, n - 1, 0, n - 1);
return BinaryTree<ElemType>(r); // 返回以r为根的二叉树
}