template
bool IsFullTree(const BinaryTree &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
bool IsCompleteTree(const BinaryTree &bt)
// 操作结果: 判断二叉树bt是否是完全二叉树
{
const BinTreeNode *r = bt.GetRoot();
if (r != NULL)
{ // 非空二叉树
const BinTreeNode *p; // 工作变量
LinkQueue
q.InQueue®; // 根入队
while(!q.Empty())
{ // 队列非空
q.OutQueue§; //出队操作
if (p != NULL)
{ // 空非指针
q.InQueue(p->leftChild); //当前结点非空,左孩子指针入队
q.InQueue(p->rightChild); //当前结点非空,则右孩子指针入队
}
else
{ // 当前指针为空,判断队列是否所有指针都为空
while(!q.Empty())
{ // 队列非空
q.OutQueue§; // 出队操作
if ( p!= NULL)
{ // 非空指针
return false; // 队列中出现非空指针,为非完全二叉树
}
}
return true; // 队列中的所有指针为空,为完全二叉树
}
}
}
else
{ // 空二叉树
return true; // 空队列是特殊的完全二叉树
}
}
template
bool IsSimilarHelp(const BinTreeNode *r1, const BinTreeNode *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
bool IsSimilar(const BinaryTree &bt1, const BinaryTree &bt2)
// 操作结果: 判断两棵二叉树是否相似
{
return IsSimilarHelp(bt1.GetRoot(), bt2.GetRoot());
}
template
void SwapBiTreeHelp(BinTreeNode *r)
// 操作结果: 交换以r为根的二叉树的所有结点的左右孩子
{
if (r != NULL)
{ // 非空二叉树
//交换根结点的左右孩子
BinTreeNode *p; // 工作指针
p = r->leftChild; r->leftChild = r->rightChild; r->rightChild = p;// 循环赋值交换左右孩子
SwapBiTreeHelp(r->leftChild); // 交换左子树的所有结点的左右孩子
SwapBiTreeHelp(r->rightChild); // 交换右子树的所有结点的左右孩子
}
}
template
void SwapBiTree(BinaryTree &bt)
// 操作结果: 交换二叉树的所有结点的左右孩子
{
SwapBiTreeHelp((BinTreeNode *)bt.GetRoot()); // 调用辅助函数实现交换二叉树的所有结点的左右孩子
}
template
int LeafNodeCountHelp(const BinTreeNode *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
int LeafNodeCount(BinaryTree bt)
// 操作结果: 统计二叉树的叶结点个数
{
return LeafNodeCountHelp(bt.GetRoot()); // 调用辅助函数统计二叉树的叶结点个数
}
template
void CreateBinaryTreeHelp_PostIn(BinTreeNode *&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(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
BinaryTree CreateBinaryTree_PostIn(ElemType post[], ElemType in[], int n)
// 操作结果:已知后序和中序序列构造二叉树
{
BinTreeNode *r; // 二叉树的根
CreateBinaryTreeHelp_PostIn(r, post, in, 0, n - 1, 0, n - 1);
return BinaryTree®; // 返回以r为根的二叉树
}