满二叉树的判断 完全二叉树判断 相似二叉树判断 二叉树结点交换 统计叶结点个数 构造二叉树

如果有学弟学妹做不出来实验二的 可以参考下 尽量自己做
这一节的实验大多都是用的递归的思想
二叉树很重要 必须要掌握他 后面的图也会用到二叉树的基础知识
大家问的比较多的问题我后面有时间就写个总结 祝学弟学妹 学业有成 天天开心

满二叉树的判断

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为根的二叉树
}
  • 12
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值