以二叉链表作为二叉树的的存储结构,编写以下算法:
目录
(5)计算二叉树的最大宽度(二叉树的最大宽度指的是某个层上的最大结点数)
(6)用按层次顺序遍历二叉树的方法,统计树中度为1的结点数目
(7)求任意二叉树中第一条最长路径的长度,并输出此路径上各个结点的值& (8)输出二叉树中每个叶子结点到根结点的路径
(1)统计二叉树的的叶结点个数
void countLeafNode(PBiTree T) //计算叶子节点
{
if (T)
{
countLeafNode(T->Lchild);
countLeafNode(T->Rchild);
if(T->Lchild==NULL&&T->Rchild==NULL)
{
sum++;
}
}
}
(2)判别两棵树是否相等
bool is_Equal(PBiTree TA,PBiTree TB) //判断两个树是否相等
{
if(TA&&TB)
{
is_Equal(TA->Lchild,TB->Lchild);
is_Equal(TA->Rchild,TB->Rchild);
if (TA->data!=TB->data)
{
return false;
}
}
return true;
}
(3)交换二叉树的每个结点的左孩子和右孩子
void ChangeNode(PBiTree T) //交换二叉树的的左孩子和右孩子
{
if (T)
{
if(T->Lchild!=NULL||T->Rchild!=NULL)
{
PBiTree Temp = T->Lchild;
T->Lchild = T->Rchild;
T->Rchild = Temp;
}
ChangeNode(T->Lchild);
ChangeNode(T->Rchild);
}
}
(4)设计二叉树的双序遍历算法
void DoubleTraverse(PBiTree T) //设计双序遍历
{
//双序遍历思想,先访问某个节点,然后接着双序遍历左子树,左子树遍历完闭再访问该节点,接着访问右节点
if(T)
{
visit(T);
DoubleTraverse(T->Lchild);
visit(T); //无非就是左子树遍历完成后再一次访问该节点;
DoubleTraverse(T->Rchild);
}
}
(5)计算二叉树的最大宽度(二叉树的最大宽度指的是某个层上的最大结点数)
void BiggestWidth(PBiTree T,PQueue Q) //出队几次就代表有几个节点
{
int flag=1,nums = 0;//记录每一层的最右节点
En_Queue(Q,T);
while (!is_Empty(Q))
{
PBiTree Node = Out_Queue(Q);
nums++;
if(Node->Lchild!=NULL)
{
En_Queue(Q,Node->Lchild);
}
if(Node->Rchild!=NULL)
{
En_Queue(Q,Node->Rchild);
}
if (Q->front==flag)//当前层次遍历结束
{
flag = Q->rear;
if(nums>max)
{
max = nums;
}
nums = 0;
}
}
}