LinkedList head, pre = NULL;//全局变量
LinkedList InOrder(BiTree bt) {
if (bt) {
InOrder(bt->lchild);//中序遍历左子树
if (bt->lchild == NULL && bt->rchild == NULL) {//叶结点
if (pre == NULL) {
head = bt;
pre = bt;
}
else {
pre->rchild = bt;
pre = bt;
}//将叶结点链入链表
}
InOrder(bt->rchild);//中序遍历右子树
pre->rchild = NULL;//设置链表尾
}
return head;
}
完整代码:
//设计一个算法将二叉树的叶结点按从左到右的顺序连成一个单链表,表头指针为head,
//链接时用叶结点的右指针域来存放单链表指针
/*
通常我们所用的先序、中序和后序遍历对于叶结点的访问顺序都是从左到右,这里我们
选择中序递归遍历。算法思想:设置前驱结点pre,初始为空。第一个叶结点由指针head
指向,遍历到叶结点时,就将它前驱的rchild指针指向它,最后一个叶结点的rchild为空。
*/
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
typedef char ElemType;
#define MaxSize 100
typedef struct BiNode {
ElemType data;
BiNode* lchild;
BiNode* rchild;
}BiNode, * BiTree,* LinkedList;
typedef struct SqQueue {
BiTree data[MaxSize];
int front, rear;
}SqQueue;
//构建二叉树
BiNode* Create(BiNode* bt) {
static int i = 0;
char ch;
//string str = "AB#D##C##";
//string str = "124##56##7##3##";
string str = "ABD#G##E##CF###";
//string str = "ABDH##I##E#J##CFK###GL###";
ch = str[i++];
if (ch == '#')bt = NULL;//建立一棵空树
else {
bt = (BiTree)malloc(sizeof(BiNode)); bt->data = ch;//生成一个结点,数据域为ch
bt->lchild = Create(bt->lchild);//递归建立左子树
bt->rchild = Create(bt->rchild);//递归建立右子树
}
return bt;
}
//typedef struct{
// BiTree data;//结点数据
//}LNode,*LinkedList;
LinkedList head, pre = NULL;//全局变量
LinkedList InOrder(BiTree bt) {
if (bt) {
InOrder(bt->lchild);//中序遍历左子树
if (bt->lchild == NULL && bt->rchild == NULL) {//叶结点
if (pre == NULL) {
head = bt;
pre = bt;
}
else {
pre->rchild = bt;
pre = bt;
}//将叶结点链入链表
}
InOrder(bt->rchild);//中序遍历右子树
pre->rchild = NULL;//设置链表尾
}
return head;
}
void printL(LinkedList L) {
if (L == NULL)
return;
while (L) {
printf("%c ", L->data);
L = L->rchild;
}
}
int main() {
//创建一棵二叉树
BiTree T = (BiTree)malloc(sizeof(BiNode));//创建一颗二叉树
T = Create(T);
LinkedList L = InOrder(T);
printf("将二叉树的叶结点按从左到右的顺序连成一个单链表,表头指针为head,链接时用叶结点的右指针域来存放单链表指针:\n");
printL(L);
}