以二叉链表作存储结构,建立一棵二叉树。 输出该二叉树的中序遍历序列,求出该二叉树的深度,并统计其叶子结点数。
二叉链表的类型描述
typedef char ElemType;
typedef struct BiNode
{ ElemType data;
struct BiNode *lchild,*rchild;
}BiNode,*BiTree;
下面给出了 二叉树遍历 函数的大部分内容,但缺少了一部分(以下划线____
标识出来的部分)。
请先将以下代码中画横线的部分补充完整,然后将完整的函数InOrder
,CountLeaf
,Depth
提交系统,完成题目要求的功能。
void InOrder(BiTree T)
{
if (T)
{
InOrder( ____ );
cout<< ____ ;
InOrder( ____ );
}
}// 统计叶子节点数
// 叶子节点个数通过参数 n 返回
void CountLeaf(BiTree T, int &n)
{
if (T)
{
if ( ____ ) n++;
CountLeaf( ____ , n);
CountLeaf( ____ , n);
}
}// 计算二叉树高度
// 高度通过 dep 返回
void Depth(BiTree T, int &dep)
{
int dl,dr;
if ( ____ ) dep=0;
else
{
Depth( ____ , ____ );
Depth( ____ , ____ );
dep=dl>dr? ____ : ____;
}
}
int main()
{
BiTree T; int n=0,dep;
CreateBiTree(T);
cout<<"InOrder:"; InOrder(T); cout<Depth(T,dep); cout<<"Depth:"< CountLeaf(T,n); cout<<"Leaf:"< return 0;
}
输入一个二叉树的先序序列,孩子为空的位置以#替代。
输出分3行
第一行 中序遍历序列
第二行 二叉树深度
第三行 叶子结点数
其中遍历过程中按访问顺序打印出结点的内容时,字符间均无间隔。 具体格式参看输出样例。
对于下图中给出的二叉树:
ABD##FE###CG#H##I##
InOrder:DBEFAGHCI
Depth:4
Leaf:4
void InOrder(BiTree T)
{
if (T!=NULL)
{
InOrder(T->lchild);
cout << T->data;
InOrder(T->rchild);
}
}// 统计叶子节点数
// 叶子节点个数通过参数 n 返回
void CountLeaf(BiTree T, int &n)
{
if (T)
{
if (T->lchild == NULL && T->rchild == NULL) n++; // 如果当前节点是叶子节点,增加叶子节点计数
CountLeaf(T->lchild, n); // 递归统计左子树中的叶子节点
CountLeaf(T->rchild, n); // 递归统计右子树中的叶子节点
}
}// 计算二叉树高度
// 高度通过 dep 返回
void Depth(BiTree T, int &dep)
{
int dl, dr;
if (T == NULL) dep = 0; // 如果当前节点为空,高度为0
else
{
Depth(T->lchild, dl); // 递归计算左子树的高度
Depth(T->rchild, dr); // 递归计算右子树的高度
dep = dl > dr ? dl + 1 : dr + 1;// 高度为左右子树中较大者加1
}
}