C语言编程实现:二叉树采用二叉链表存储,要求建立一颗二叉树,并输出要求的二叉树树状形式与结点编号。

一、题目

编程实现:二叉树采用二叉链表存储,要求建立一颗二叉树,并输出要求的二叉树树状形式与结点编号。结点如图1.1所示。

                                   

                                                                                  图 1.1

      其中,二叉树的num编号域为整数类型,data数据域为字符类型,要求生成二叉树中编号,从1开始进行连续编号,每个结点的编号大于其左右子树中孩子的编号,同一个结点的左右孩子中,其左孩子的编号小于其右孩子的编号,请给出对二叉树中结点的实现如上要求编号并按如下图1.2所示的二叉树树状形式打印出相应点编号的程序。

测试数据:AB凵D凵凵CE凵F凵凵凵 (其中符号“凵”代表空格)

                        C语言编程实现:二叉树采用二叉链表存储,要求建立一颗二叉树,并输出要求的二叉树树状形式与结点编号。_第1张图片

                                                                                  图1.2

 二、题目解析

  1、题目分析

       本题的要求就是输入一颗二叉树序列,然后输出这个二叉树的横向显示形状,并且按照编号要求输出二叉树横向显示形 状所对应的结点编号。

 2、解题思路

(1)根据题目要求可知本题考查了二叉树创建算法、二叉树横向树状打印算法、二叉树遍历算法。

(2)根据输入的数据和对应的二叉树可知,本题用二叉树的前序遍历创建一颗二叉树。

(3)比较二叉树和对应的二叉树树状,可看出对应的树状是二叉树的横向显示图

  分析:①二叉树的横向显示应是竖向显示的90°旋转。由下图2.1可知,这种树形打印格式要求先打印右子树,再打印根,最后打印左子树,按由上而下顺序看,其输出的结点序列为CFEADB,这刚好是逆中序遍历序列。所以解决二叉树横向显示问题采用“逆中序”遍历方法,因此横向显示算法先右子树、再根结点、再左子树的RDL结构。

  ②在这种输出格式中,结点的左、右位置与结点的层深(即结点所在高度)有关,所以在实现此算法(即实现函数)中设置一个表示当前结点层深的参数,以控制输出结点的左右位置,每当递归进层时层深参数加1。这些操作应在访问根结点时实现。

                                          C语言编程实现:二叉树采用二叉链表存储,要求建立一颗二叉树,并输出要求的二叉树树状形式与结点编号。_第2张图片    

                                                                          图 2.1

(4)根据二叉树树状所对应的序列编号可知,每个结点对应的编号是二叉树后序遍历的顺序编号。即二叉树后序遍历             序列为DBFECA,所对应编号为123456。所以对二叉树编号的算法(即实现函数)就是用二叉树的后序遍历完成。

 

 三、代码实现

typedef struct BiTNode{
	char data;
	int num;
	struct BiTNode *Lchild, *Rchild;
}BiTNode,*BiTree;
void createBiTree(BiTree &T){   //前序遍历创建二叉树
	char ch;
	ch=getchar();
	if (ch != ' '){
		T = (BiTree)malloc(sizeof(BiTNode));
		T->Lchild = T->Rchild = NULL;
		T->data = ch;
		createBiTree(T->Lchild);
		createBiTree(T->Rchild);
	}
}

int count = 1;
void putNum(BiTree &T){    //由题可知,对二叉树按后序遍历进行编号
	if (T != NULL){
		putNum(T->Lchild);
		putNum(T->Rchild);
		T->num = count;
		count++;
	}
}

void printTree(BiTree T,int nLayer){    //输出要求的树状
	if (T == NULL) return;
	printTree(T->Rchild,nLayer+1);
	for (int i = 0; i < nLayer; i++)
		printf(" ");
	printf("%c\n", T->data);     //按逆中序输出结点,用层深决定的左、右位置
	printTree(T->Lchild,nLayer+1);
}

void printTreeNum(BiTree T, int nLayer){    //输出要求的树状编号
	if (T == NULL) return;
	printTreeNum(T->Rchild, nLayer + 1);
	for (int i = 0; i < nLayer; i++)
		printf(" ");
	printf("%d\n", T->num);     //按逆中序输出结点,用层深决定的左、右位置
	printTreeNum(T->Lchild, nLayer + 1);
}

 四、输出结果

                  C语言编程实现:二叉树采用二叉链表存储,要求建立一颗二叉树,并输出要求的二叉树树状形式与结点编号。_第3张图片

你可能感兴趣的:(链表,算法,二叉树,数据结构)