“遍历”是二叉树各种操作的基础,假设访问结点的具体操作不仅仅局限于输出结点数据域的值,而是把“访问”延伸到对结点的判别、计数等其他操作,可以解决一些关于二叉树的其他实际问题。如果在遍历过程中生成结点,这样便可建立二叉树的存储结构。
以下是作为初学者的我今天的学习内容:
一、按先序遍历的顺序建立二叉树的二叉链表
例:已知先序序列为:ABCDEGF
(1)从键盘输入二叉树的结点信息,建立二叉树的存储结构
(2)在建立二叉树的过程中按照二叉树先序方式建立
【算法步骤】
- 扫描字符序列,读入ch;)
- 如果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);
}