已知一棵以二叉链表存储的二叉树,按从右到左的次序,利用叶子结点建立一个带头结点的双向链表。
(1)从键盘输入扩展的先序结点数据,建立二叉树。
(2)找叶子结点,找到后从二叉树中删除,然后插入到双向链表中。
(3)要求程序通过一个主菜单进行控制,通过选择菜单项序号调用各功能函数。
[提示]
前序、中序、后序遍历二叉树,访问叶子结点的相对次序都是从左至右。因此,可以采用头插法建立双向链表。
树的二叉链表的结点与双向链表的结点结构相同,只是对两个指针域的解释不同。
typedef struct tree {
char data;
struct tree *Llink;//左儿子 前驱节点
struct tree *Rlink;//右儿子 后继节点
struct tree *Parent;//父节点
} BTNode,*BinTree,DNode,*DoubleList;
测试数据,其扩展的先序遍历序列为ABC..DE.G..F..H..,建立二叉树的遍历叶子结点的次序为:C G F H。 所建立的双向链表为:
L-> <=>H<=>F<=>G<=>C
代码实现
#include<stdio.h>
#include<stdlib.h>
#include <math.h>
#define TRUE 1
#define FALSE 0
#define MAXSIZE 50
#define scanf_s scanf
//二叉树节点
typedef struct tree {
char data;
struct tree *Llink;//左儿子 前驱节点
struct tree *Rlink;//右儿子 后继节点
struct tree *Parent;//父节点
} BTNode,*BinTree,DNode,*DoubleList;
int Select_menu() {
int sn;
printf(" 二叉树打印\n");
printf("-------------------------------------------\n");
printf("1.利用扩展的先序序列建立二叉树\n");
printf("2 找叶子结点,找到后从二叉树中删除,然后插入到双向链表中并打印 。\n");
printf("0.退出系统\n");
printf("===============================\n");
printf(" 请输入0--2: \n");
for (;;) {
scanf_s("%d", &