博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
二叉树先序序列和中序序列求解树
阅读量:6182 次
发布时间:2019-06-21

本文共 5212 字,大约阅读时间需要 17 分钟。

hot3.png

这种题一般有二种形式,共同点是都已知中序序列。如果没有中序序列,是无法唯一确定一棵树的。

<1>已知二叉树的前序序列和中序序列,求解树。

1、确定树的根节点。树根是当前树中所有元素在前序遍历中最先出现的元素。

2、求解树的子树。找出根节点在中序遍历中的位置,根左边的所有元素就是左子树,根右边的所有元素就是右子树。若根节点左边或右边为空,则该方向子树为空;若根节点

边和右边都为空,则根节点已经为叶子节点。

3、递归求解树。将左子树和右子树分别看成一棵二叉树,重复1、2、3步,直到所有的节点完成定位。

<2>、已知二叉树的后序序列和中序序列,求解树。

1、确定树的根。树根是当前树中所有元素在后序遍历中最后出现的元素。

2、求解树的子树。找出根节点在中序遍历中的位置,根左边的所有元素就是左子树,根右边的所有元素就是右子树。若根节点左边或右边为空,则该方向子树为空;若根节点

边和右边都为空,则根节点已经为叶子节点。

3、递归求解树。将左子树和右子树分别看成一棵二叉树,重复1、2、3步,直到所有的节点完成定位。

测试用例:

<1>先序 中序 求 后序

输入:

先序序列:ABCDEGF

中序序列:CBEGDFA

输出后序:CGEFDBA

代码:

/*	PreIndex: 前序序列字符串中子树的第一个节点在PreArray[]中的下标    InIndex:  中序序列字符串中子树的第一个节点在InArray[]中的下标	subTreeLen: 子树的字符串序列的长度	PreArray: 先序序列数组	InArray:中序序列数组*/void PreInCreateTree(BiTree &T,int PreIndex,int InIndex,int subTreeLen){	//subTreeLen < 0 子树为空	if(subTreeLen <= 0){		T = NULL;		return;	}	else{		T = (BiTree)malloc(sizeof(BiTNode));		//创建根节点		T->data = PreArray[PreIndex];		//找到该节点在中序序列中的位置		int index = strchr(InArray,PreArray[PreIndex]) - InArray;		//左子树结点个数		int LenF = index - InIndex;		//创建左子树		PreInCreateTree(T->lchild,PreIndex + 1,InIndex,LenF);		//右子树结点个数(总结点 - 根节点 - 左子树结点)		int LenR = subTreeLen - 1 - LenF;		//创建右子树		PreInCreateTree(T->rchild,PreIndex + LenF + 1,index + 1,LenR);	}}

主函数调用:

BiTree T;	PreInCreateTree(T,0,0,strlen(InArray));	PostOrder(T);

另一种算法:

/*	PreS       先序序列的第一个元素下标    PreE       先序序列的最后一个元素下标	InS        中序序列的第一个元素下标 	InE        先序序列的最后一个元素下标  	PreArray   先序序列数组	InArray    中序序列数组*/void PreInCreateTree(BiTree &T,int PreS ,int PreE ,int InS ,int InE){	int RootIndex;	//先序第一个字符	T = (BiTree)malloc(sizeof(BiTNode)); 	T->data = PreArray[PreS];	//寻找该结点在中序序列中的位置	for(int i = InS;i <= InE;i++){		if(T->data == InArray[i]){			RootIndex = i;			break;		}	}	//根结点的左子树不为空	if(RootIndex != InS){		//以根节点的左结点为根建树		PreInCreateTree(T->lchild,PreS+1,(RootIndex-InS)+PreS,InS,RootIndex-1);	}	else{		T->lchild = NULL;	}	//根结点的右子树不为空	if(RootIndex != InE){		//以根节点的右结点为根建树		PreInCreateTree(T->rchild,PreS+1+(RootIndex-InS),PreE,RootIndex+1,InE);	}	else{		T->rchild = NULL;	}}

<2>中序 后序 求先序

输入:

中序序列:CBEGDFA

后序序列:CGEFDBA

输出先序:ABCDEGF

代码:

/*	PostIndex: 后序序列字符串中子树的最后一个节点在PreArray[]中的下标    InIndex:  中序序列字符串中子树的第一个节点在InArray[]中的下标	subTreeLen: 子树的字符串序列的长度	PostArray: 后序序列数组	InArray:中序序列数组*/void PostInCreateTree(BiTree &T,int PostIndex,int InIndex,int subTreeLen){	//subTreeLen < 0 子树为空	if(subTreeLen <= 0){		T = NULL;		return;	}	else{		T = (BiTree)malloc(sizeof(BiTNode));		//创建根节点		T->data = PostArray[PostIndex];		//找到该节点在中序序列中的位置		int index = strchr(InArray,PostArray[PostIndex]) - InArray;		//左子树结点个数		int LenF = index - InIndex;		//创建左子树		PostInCreateTree(T->lchild,PostIndex - (subTreeLen - 1 - LenF) - 1,InIndex,LenF);		//右子树结点个数(总结点 - 根节点 - 左子树结点)		int LenR = subTreeLen - 1 - LenF;		//创建右子树		PostInCreateTree(T->rchild,PostIndex-1,index + 1,LenR);	}}

主函数调用:

BiTree T2;	PostInCreateTree(T2,strlen(PostArray) - 1,0,strlen(InArray));	PreOrder(T2);

完整代码:

#include
#include
using namespace std;//二叉树结点typedef struct BiTNode{ //数据 char data; //左右孩子指针 struct BiTNode *lchild,*rchild;}BiTNode,*BiTree;//先序序列char PreArray[101] = "ABCDEGF";//中序序列char InArray[101] = "CBEGDFA";//后序序列char PostArray[101] = "CGEFDBA";/* PreIndex: 前序序列字符串中子树的第一个节点在PreArray[]中的下标    InIndex:  中序序列字符串中子树的第一个节点在InArray[]中的下标 subTreeLen: 子树的字符串序列的长度 PreArray: 先序序列数组 InArray:中序序列数组*/void PreInCreateTree(BiTree &T,int PreIndex,int InIndex,int subTreeLen){ //subTreeLen < 0 子树为空 if(subTreeLen <= 0){ T = NULL; return; } else{ T = (BiTree)malloc(sizeof(BiTNode)); //创建根节点 T->data = PreArray[PreIndex]; //找到该节点在中序序列中的位置 int index = strchr(InArray,PreArray[PreIndex]) - InArray; //左子树结点个数 int LenF = index - InIndex; //创建左子树 PreInCreateTree(T->lchild,PreIndex + 1,InIndex,LenF); //右子树结点个数(总结点 - 根节点 - 左子树结点) int LenR = subTreeLen - 1 - LenF; //创建右子树 PreInCreateTree(T->rchild,PreIndex + LenF + 1,index + 1,LenR); }}/* PostIndex: 后序序列字符串中子树的最后一个节点在PreArray[]中的下标    InIndex:  中序序列字符串中子树的第一个节点在InArray[]中的下标 subTreeLen: 子树的字符串序列的长度 PostArray: 后序序列数组 InArray:中序序列数组*/void PostInCreateTree(BiTree &T,int PostIndex,int InIndex,int subTreeLen){ //subTreeLen < 0 子树为空 if(subTreeLen <= 0){ T = NULL; return; } else{ T = (BiTree)malloc(sizeof(BiTNode)); //创建根节点 T->data = PostArray[PostIndex]; //找到该节点在中序序列中的位置 int index = strchr(InArray,PostArray[PostIndex]) - InArray; //左子树结点个数 int LenF = index - InIndex; //创建左子树 PostInCreateTree(T->lchild,PostIndex - (subTreeLen - 1 - LenF) - 1,InIndex,LenF); //右子树结点个数(总结点 - 根节点 - 左子树结点) int LenR = subTreeLen - 1 - LenF; //创建右子树 PostInCreateTree(T->rchild,PostIndex-1,index + 1,LenR); }}//先序遍历  void PreOrder(BiTree T){      if(T != NULL){   //访问根节点   printf("%c ",T->data);        //访问左子结点          PreOrder(T->lchild);          //访问右子结点          PreOrder(T->rchild);       }  }  //后序遍历  void PostOrder(BiTree T){      if(T != NULL){          //访问左子结点          PostOrder(T->lchild);          //访问右子结点          PostOrder(T->rchild);  //访问根节点   printf("%c ",T->data);    }  }  int main(){ BiTree T; PreInCreateTree(T,0,0,strlen(InArray)); PostOrder(T); printf("\n"); BiTree T2; PostInCreateTree(T2,strlen(PostArray) - 1,0,strlen(InArray)); PreOrder(T2);    return 0;}

转载于:https://my.oschina.net/u/1861837/blog/324120

你可能感兴趣的文章
纯原生组件化-模块化的探索
查看>>
Servlet自动刷新页面
查看>>
Spring Cloud Config 2.1.2、2.0.4 和 1.4.6 发布,修复 CVE-2019-3799
查看>>
智能家居如火如荼,各玩家的第一步棋都下在哪里?
查看>>
Quarkus 0.12.0 发布,下一代 K8s 原生 Java 框架
查看>>
内置函数
查看>>
这届showgirl真不行,那我们盘点一下ChinaJoy的“八宗最”
查看>>
激光雷达——人工智能机器人的行走“慧眼”
查看>>
达美乐和福特想要搞事情,准备用自动驾驶汽车送外卖
查看>>
Hadoop2源码分析-YARN RPC 示例介绍
查看>>
关于AI,那些年“砖家”曾经发表的所谓科技预测
查看>>
航天科工自行研发“反无人机”系统,综合拦截成功率高达80%
查看>>
中科曙光与寒武纪合作推出AI服务器,将实时分析能力提升百倍
查看>>
IBM押注AI、量子计算、区块链,发布未来5年五大科技预测
查看>>
风口行业程序员必看!直播网络成本降低70%,智能接入网关是怎样实现的?
查看>>
2018第五届中国机器人应用与产业发展论坛 &2018中国智能包装工业发展大会
查看>>
日本研发投篮机器人Cue,投球命中率接近100%
查看>>
WPS for Linux字体配置(Ubuntu 16.04)
查看>>
陈妍希和你一起带“蛙儿子”做公益,守护宝贝她有话跟你说!
查看>>
享受生活:值得关注的七件家居智能硬件
查看>>