根据二叉树遍历的先序序列和中序序列,建立二叉树的二叉链表

题目描述:设一棵二叉树各结点的值各不相同,其先序遍历序列和中序遍历序列分别存于两个一维数组A[1...n]和B[1..n]中,试编写算法建立该二叉树的二叉链表。

算法思想:根据二叉树的先序遍历序列和中序遍历序列可以创建一棵唯一的二叉树。先序遍历的第一个结点,是二叉树的根节点,在中序遍历找到根结点后,可以知道根节点的左右子树的结点和左右子树的结点数(用llen和rlen表示),然后递归分别建立其左右子树,依次扫描二叉树先序序列,然后在中序序列中找到该结点从而确定该结点下的左右子树,直到左右子树的结点数为0时(llen==0和rlen==0),二叉树建立完毕。

算法代码:

typedef struct BiTNode{
	ElemType data;
	struct BiTNode *lchild, *rchild;
}BiTNode,*BiTree;
BiTree create_BiTree(ElemType A[], ElemType B[],int la,int ha,int lb,int hb){
	//A[]存放前序序列,B[]存放中序序列。la和ha分别表示前序序列的起始位置和最终位置,lb和hb分别表示中序序列的起始位置和最终位置
	int llen, rlen;  //中序序列中左右子树的长度
	int s=0;
	BiTree T = (BiTree)malloc(sizeof(BiTNode));
	T->data = A[la];
	T->lchild = T->rchild = NULL;
	while (A[la] != B[s]) //s表示跟结点在中序序列中的位置
		s++; 
	llen = s - lb;
	rlen = hb - s;
	if (llen != 0){
		T->lchild = create_BiTree(A, B, la + 1,la+llen, lb ,lb + llen - 1);
	}else{
		T->lchild = NULL; //左子树长度为零时,左孩子为空
	}

	if (rlen != 0){
		T->rchild = create_BiTree(A, B, ha - rlen+1, ha, hb - rlen+1, hb);
	}else{
		T->rchild = NULL;//右子树长度为零时,有孩子为空
	}
	return T;
}

完整代码:

#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
typedef char ElemType;
typedef struct BiTNode{
	ElemType data;
	struct BiTNode *lchild, *rchild;
}BiTNode,*BiTree;
BiTree create_BiTree(ElemType A[], ElemType B[],int la,int ha,int lb,int hb){
	//A[]存放前序序列,B[]存放中序序列。la和ha分别表示前序序列的起始位置和最终位置,lb和hb分别表示中序序列的起始位置和最终位置
	int llen, rlen;  //中序序列中左右子树的长度
	int s=0;
	BiTree T = (BiTree)malloc(sizeof(BiTNode));
	T->data = A[la];
	T->lchild = T->rchild = NULL;
	while (A[la] != B[s]) //s表示跟结点在中序序列中的位置
		s++; 
	llen = s - lb;
	rlen = hb - s;
	if (llen != 0){
		T->lchild = create_BiTree(A, B, la + 1,la+llen, lb ,lb + llen - 1);
	}else{
		T->lchild = NULL; //左子树长度为零时,左孩子为空
	}

	if (rlen != 0){
		T->rchild = create_BiTree(A, B, ha - rlen+1, ha, hb - rlen+1, hb);
	}else{
		T->rchild = NULL;//右子树长度为零时,有孩子为空
	}
	return T;
}
void postoder(BiTree T){
	if (T !=  NULL){
		postoder(T->lchild);
		postoder(T->rchild);
		cout << T->data << "\t";
	}
}
int main(){
	int n;
	cout << "输入二叉树总结点数:";
	cin >> n;
	char *A = (char *)malloc(sizeof(char)*n);
	char *B = (char*)malloc(sizeof(char)*n);
	cout << "\n" << "输入二叉树遍历的前序序列:";
	for (int i = 0; i< n; i++){
		cin >> A[i];
	}
	cout << "\n" << "输入二叉树遍历的中序序列:";
	for (int i = 0; i < n; i++){
		cin >> B[i];
	}
	BiTree T = create_BiTree(A, B,0,n-1,0,n-1);
	cout << "\n" << "二叉树后序序列:";
	postoder(T);//后序遍历二叉树检验结果
	system("pause");
	return 0;
}

样例:

                                  

二叉树先序序列:ABDEHCFIG

二叉树中序序列:DBHEAFICG

二叉树后序序列:DHEBIFGCA

结果显示:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值