2021-11-07 输出二叉查找树的叶子结点

【问题描述】

从标准输入中输入一组整数,在输入过程中按照左子结点值小于根结点值、右子结点值大于等于根结点值的方式构造一棵二叉树(二叉查找树),然后从左至右输出所有树中叶结点的值及高度(根结点的高度为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;
}

本文章仅供学习和参考!

欢迎交流~ 

Guess you like

Origin blog.csdn.net/m0_58489132/article/details/121190924