计算不同类型(度为0、1、2)结点总数,建立二叉树,复制二叉树,计算深度

“遍历”是二叉树各种操作的基础,假设访问结点的具体操作不仅仅局限于输出结点数据域的值,而是把“访问”延伸到对结点的判别、计数等其他操作,可以解决一些关于二叉树的其他实际问题。如果在遍历过程中生成结点,这样便可建立二叉树的存储结构。
以下是作为初学者的我今天的学习内容:

一、按先序遍历的顺序建立二叉树的二叉链表

例:已知先序序列为:ABCDEGF
(1)从键盘输入二叉树的结点信息,建立二叉树的存储结构
(2)在建立二叉树的过程中按照二叉树先序方式建立

【算法步骤】

  1. 扫描字符序列,读入ch;)
  2. 如果ch是一个‘#’字符,表明二叉树为空,即T=NULL;否则执行以下操作:
    1)申请一个结点空间T;
    2)将ch赋值给T->data;
    3)递归创建T的左子树;
    4)递归创建T的右子树;

【算法描述】

void CreateBiTree(BiTree &T)
{
	char ch;
	cin>>ch;
	if(ch=='#')
		T=NULL;
	else
	{
		T=new BiTNode;//生成根结点
		T->data=ch;//将根结点数据域置为ch
		CreateBitree(T->lchild);//递归创建左子树
		CreateBitree(T->rchild);//递归创建右子树
	}	//如果不用void 类型,必须写返回值,如return OK,return true等

}//CreateBiTree

二、复制二叉树

利用已有的二叉树复制得到另外一颗与其完全相同的二叉树,复制函数的实现与二叉树先序遍历的实现非常类似

【算法描述】

int Copy(BiTree T,BiTree &NewT)
{
	if(T==NULL)//如果是空树,递归结束
	{
		NewT=NULL;
		return 0;
	}
	else
	{
		NewT=new BiTNode;
		NewT->data=T=>data;//复制根结点
		Copy(T->lchild,NewT->lchild);//递归复制左子树
		Copy(T->rchild,NewT->rchild);//递归复制右子树
	}
}

 

三、计算二叉树的深度

二叉树的深度为树中结点的最大层次,二叉树的深度为左子树深度的较大者加一,计算二叉树的深度是在后序遍历二叉树的基础上进行的运算。

【算法步骤】

如果是空树,递归结束,深度为0,否则执行一下操作:

  • 递归计算左子树的深度记为m
  • 递归计算右子树的深度记为n
  • 如果m大于n,二叉树的深度为m+1,否则为n+1;

【算法描述】

int Depth(BiTree T)
{
	if(T==NULL)
		return 0;//如果是空树,返回深度0,递归结束
	else
	{
		m=Depth(T->lchild);//递归计算左子树深度记为m
		n=Depth(T->rchild);//递归计算右子树的深度记为n
		if(m>n)
			return (m+1);
		else
			return (n+1);	
	}	二叉树的深度为m与n的较大者+1
}

四、计算二叉树结点总数

如果是空树,则结点个数为0;否则,结点个数为左子树的结点个数+右子树的结点个数+1。

【算法描述】

int NodeCount(BiTree T)
{//统计二叉树T中结点的个数
	if(T==NULL)
		return 0;
	else
		return NodeCount(T->lchild)+NodeCount(T->rchild)+1;	
}

补充:计算二叉树中度为0、1、2的结点的个数

计算二叉树叶子结点总数

如果是空树,则叶子结点个数为0;
否则,叶子结点数为左子树的叶子结点个数+右子树的叶子结点个数。

int LeafCount(BiTree T)
{
	if(T==NULL)//如果树为空返回0
		return 0;
	if(T->lchild==NULL && T->rchild==NULL)
		return 1;//如果是叶子结点返回1	
	else
		return 	LeafCount(T->lchild)+LeafCount(T->rchild);
}//叶子结点总数

计算二叉树中度为1的结点个数

int oneCount(BiTree T)
{
	 if(T==NULL)//如果树为空返回0
	 	 return 0;
	 if((T->lchild!=NULL&&T->rchild==NULL)||(T->lchild==NULL&&T->rchild!=NULL))
	 	 return 1+oneCount(T->lchild)+oneCount(T->rchild); 
	 else 
		  return oneCount(T->lchild)+oneCount(T->rchild);
}

计算二叉树中度为2的结点个数

 int twoCount(BiTree T)
{
	 if(T==NULL)//如果树为空返回0
		  return 0;
	 if(T->lchild!=NULL && T->rchild!=NULL)
	  	return 1+twoCount(T->lchild)+twoCount(T->rchild); 
	 else 
	 	 return twoCount(T->lchild)+twoCount(T->rchild);
}
发布了34 篇原创文章 · 获赞 85 · 访问量 4611

猜你喜欢

转载自blog.csdn.net/weixin_45895026/article/details/104060621