树和二叉树——算法设计练习习题

1、设计算法求二叉树的结点个数。

void Count(BiNode *root){
    if (root) {
         Count(root->lchild);
         number+ +;  //number为数据成员
         Count(root->rchild);
   }
}

2、树中节点的数目
左子树中节点的数目+右子树中节点的数目+1

template<class T>
int BiTree<T>::count(BiNode<T>* root){
	int number=0;

	if (root==NULL)
		number=0;
	else
		number=count(root->lchild)+count(root->rchild)+1;
	return number;
}

3、统计叶子节点的数目
增加一个数据成员,leafcount, 初值为0
对树进行遍历。 如果一个节点是叶子,则将leafcount+1;
可以在前序、中序或后序的遍历过程中进行计算。

template<typename T> 
void BiTree<T>:: countleaf(BiTreeNode<T> * root){
	if (root) {
		if (root->lchild==NULL && root->rchild==NULL)
			leafcount=leafcount+1;
		else
		{
			countleaf(root->lchild);
			countleaf(root->rchild);
		}
	}
	return;
}

4、树中叶子结点的数目
左子树中叶子节点的数目+右子树中叶子节点的数目

template<class T>
int BiTree<T>::leafcount(BiNode<T>* root){
	int number=0;

	if (root==NULL)
		number=0;
	else if(root->lchild==NULL && root->rchild==NULL)
		number=1;
	else
	    number=leafcount(root->lchild)+leafcount(root->rchild);
	return number;
}

5、计算树的高度
高度的定义:max(左子树高度,右子树高度)+1
算法分析
从根节点出发开始计算,
如果root==NULL, 高度为0;
否则,分别计算左子树的高度;右子树的高度;返回max(左子树高度,右子树高度)+1
递归的定义

template<typename T> 
 int BiTree<T>::cal_height(BiTreeNode<T> * root){
	int lheight=0,rheight=0;
	if (root==0)  	 return 0;	
lheight=cal_height(root->lchild);
	rheight=cal_height(root->rchild);
	if (lheight>rheight)	return lheight+1;
	else 		return rheight+1;
}

6、输出中缀表达式。
并加上相应的括号(a+(b*(c-d)))-(e/f)
在这里插入图片描述
基本思想
中序遍历。
中序遍历左子树前,输出左括号
中序遍历右子树后,输出右括号
如果遍历叶子结点的左右子树,不输出括号
如果遍历根节点的左右子树,不输出括号(否则,会得到形如(a+b)的表达式)

void BiTree<T>::In_Expression(BiNode<T>* root){
	if(root)
	{
  	   if(root!=this->root&&root->lchild!=0&&root->rchild!=0)
   		         cout<<"(";
	   In_Expression(root->lchild);
	   cout<<root->data;
   	   In_Expression(root->rchild);
 	   if(root!=this->root&&root->lchild!=0&&root->rchild!=0)
			cout<<")";
	}
	
}

7、输出二叉树逆时针旋转90后的形状
二叉树逆时针旋转90后输出
按照从右向左的顺序,中序遍历
每行输出一个结点
按照结点的层次,进行缩进。

template <class T>
void BiTree<T>::Left_Rotate(BiNode<T>* root,int level){
	if(root){
		Left_Rotate(root->rchild, level+1);
		for(int i=0;i<level;i++)
			cout<<"\t";
		cout<<root->data<<endl;
		Left_Rotate(root->lchild, level+1);
	}
}

8、计算二叉树的宽度
所谓宽度是指在二叉树的各层上,具有结点数最多的那一层上的结点总数 。

struct q_element{	BiNode * root;		int level;};
int BiTree::Width(){
	queue< struct q_element > q;
	int num[100]={0,1};
	q_element s,child;
	BiNode *root;
	root=this->root;
	if(root==NULL)
		return 0;
	s.root=root;	s.level=1;	q.push(s);	
	while(!q.empty())	{
		s=q.front();
		if(s.root->lchild){
			num[s.level+1]++;
			child.root=s.root->lchild;
			child.level=s.level+1;
			q.push(child);
		}
				if(s.root->rchild)	{
			num[s.level+1]++;
			child.root=s.root->rchild;
			child.level=s.level+1;
			q.push(child);
		}
		q.pop();
	}
	int max=0,i=1;
	while(num[i]>0){
		if(max<num[i])
			max=num[i];
		i++;
	}
	
	return max;
}
		

8、判断一棵树是否是完全二叉树
基本思想:
基于层次遍历。
定义bool变量is_leaf,初值为false
如果is_leaf的值为true, 表示遍历的过程中遇到了叶子结点。
一旦在叶子结点之后再出现度为1、2的结点,则该树不是完全二叉树。
在层次遍历中,如果遇到一个节点
只有右儿子,没有左儿子,
false;
只有左,没有右
If (is_leaftrue) return false;
Else is_leaf=true;
两个儿子均为空
is_leaf=true
两个儿子均不空
If (is_leaf
true) return false;
将存在的儿子入队
能遍历完所有节点,即为完全二叉树

template<class T>
bool BiTree<T>::Is_Wanquan(BiNode<T> *root){
	queue<BiNode<T>*> q;
	BiNode <T>* pointer;
	bool is_leaf=false;
	if(!root)
		return false;
	q.push(root);
		while(!q.empty())	{
		pointer=q.front();	q.pop();
		if(pointer->rchild!=NULL && pointer->lchild==NULL)
			return false;
		else if(pointer->rchild==NULL && pointer->lchild!=NULL )
			if(is_leaf)	
				return false;
			else  //如果是完全二叉树,则,该结点之后的结点应为叶子节点
				is_leaf=true;
		else if(pointer->rchild==NULL && pointer->lchild==NULL )
			is_leaf=true;
		if(pointer->lchild!=NULL)
			q.push(pointer->lchild);
		if(pointer->rchild!=NULL)
			q.push(pointer->rchild);
	}
	return true;
}
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二叉树同样是常见的数据结构,它们的主要区别在于节点的度数和子节点的顺序。可以有多个子节点,而二叉树只有左右两个子节点。 的程序设计基本思想是通过对的节点进行操作来实现对数据的管理和处理。在程序设计中,需要先定义的数据结构,包括节点类型和操作函数等。然后根据需要,实现各种对的操作,例如插入节点、删除节点、遍历等。 二叉树的程序设计基本思想也是类似的,通过对二叉树的节点进行操作来实现对数据的管理和处理。在程序设计中,需要先定义二叉树的数据结构,包括节点类型和操作函数等。然后根据需要,实现各种对二叉树的操作,例如插入节点、删除节点、遍历二叉树等。 二叉树的程序设计原理是将它们的数据结构和操作函数封装成一个类(或模块、包),并提供对外的接口。这样可以实现数据的封装和隐藏,使得程序更加安全和可靠。同时,也可以提高程序的可维护性和可重用性,方便程序的开发和维护。 下面是二叉树的一些常见算法描述: 1. 的应用:查找的深度 对于一棵,求它的深度(或高度)。算法描述如下: 1. 如果为空,则深度为0。 2. 如果不为空,则对的每个子求深度,取其中的最大值,再加上1即可。 2. 二叉树的应用:二叉查找 二叉查找(Binary Search Tree,BST)是一种常见的数据结构,可以用于进行快速的查找、插入和删除操作。它的特点是:对于每个节点,其左子的所有节点值均小于该节点的值,右子的所有节点值均大于该节点的值。 BST的插入操作算法描述如下: 1. 如果为空,则新建一个节点,作为根节点。 2. 如果插入的值小于根节点的值,则将其插入到左子中,否则插入到右子中。 3. 如果插入的值已经存在于中,则返回插入失败。 4. 插入完成后,更新的高度和平衡因子,保持的平衡性。 BST的删除操作算法描述如下: 1. 如果要删除的节点是叶子节点,则直接删除。 2. 如果要删除的节点只有一个子节点,则将其子节点替换为该节点即可。 3. 如果要删除的节点有两个子节点,则找到其右子中的最小节点,将其替换为要删除的节点,然后删除该最小节点即可。 4. 删除完成后,更新的高度和平衡因子,保持的平衡性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值