【问题描述】
从标准输入中输入一组整数,在输入过程中按照左子结点值小于根结点值、右子结点值大于等于根结点值的方式构造一棵二叉树(二叉查找树),然后从左至右输出所有树中叶结点的值及高度(根结点的高度为1)。例如,若按照以下顺序输入一组整数:50、38、30、64、58、40、10、73、70、50、60、100、35,则生成下面的二叉树(二叉查找树):
从左到右的叶子结点包括:10、35、40、50、60、70、100,叶结点40的高度为3,其它叶结点的高度都为4。
【输入形式】
先从标准输入读取整数的个数,然后从下一行开始输入各个整数,整数之间以一个空格分隔。
【输出形式】
按照从左到右的顺序分行输出叶结点的值及高度,值和高度之间以一个空格分隔。
【样例输入】
13
50 38 30 64 58 40 10 73 70 50 60 100 35
【样例输出】
10 4
35 4
40 3
50 4
60 4
70 4
100 4
【样例说明】
按照从左到右的顺序输出叶结点(即没有子树的结点)的值和高度,每行输出一个。
【运行结果如下】
【代码如下】
#include<stdio.h>
#include<stdlib.h>
#define OVERFLOW -1
typedef int TElemType;
typedef void Status;
/*二叉树的二叉链表存储表示*/
typedef struct BiTNode{
TElemType data;
struct BiTNode *lchild, *rchild; //左右孩子指针
}BiTNode, *BiTree;
Status CreateBiTree(BiTree &T,TElemType ch)
{
/*构造二叉树*/
if(!T) //T为空结点时
{
T = new BiTNode;
if (!T) exit(OVERFLOW); //创建结点失败
T->data = ch; //生成根结点
T->lchild = NULL;
T->rchild = NULL;
}
else
{
if (ch < (T->data))
CreateBiTree(T->lchild,ch); //构造左子树
else
CreateBiTree(T->rchild,ch); //构造右子树
}
}
Status InitBiTree(BiTree &T)
{
/*初始化*/
TElemType i,data,len;
T = NULL; //根结点指空
scanf("%d",&len); //二叉树结点的个数
for (i = 0; i < len; i++)
{
scanf("%d",&data);
CreateBiTree(T,data);
}
}
Status TraverseLeaf(BiTree &T,int number)
{
/*遍历叶子结点*/
if (!T->lchild && !T->rchild) //根结点没有左右孩子时
printf("%d"" ""%d\n",T->data,number+1);
if (T->lchild)
TraverseLeaf(T->lchild,number+1);
if (T->rchild)
TraverseLeaf(T->rchild,number+1);
}
int main()
{
BiTree T;
InitBiTree(T);
TraverseLeaf(T,0);
return 0;
}
本文章仅供学习和参考!
欢迎交流~