设计一个算法将二叉树的叶结点按从左到右的顺序连成一个单链表,表头指针为head,链接时用叶结点的右指针域来存放单链表指针

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
#include
#include
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);
}

 二叉树

 设计一个算法将二叉树的叶结点按从左到右的顺序连成一个单链表,表头指针为head,链接时用叶结点的右指针域来存放单链表指针_第1张图片

你可能感兴趣的:(C++,数据结构,算法,数据结构,leetcode)