先序序列和中序序列构造二叉树,中序序列和后序序列构造二叉树
来源:互联网 发布:js object clone 编辑:程序博客网 时间:2024/05/22 09:48
1:首先读者要了解二叉树BinaryTree基本概念,其次区分左子树与左孩子节点,右子树与右孩子节点。(在数据结构中 一个节点可以成为一棵树,对于没有孩子节点的节点称为为叶子节点)。
2:在读这篇博文之前,读者脑海中应该有这样一个模型(看图)
整棵二叉树根节点为A,A的左孩子为B,A的左子树由B、D、G 3个节点构成,A的右孩子为C,A的右子树由C、E、F 3个节点构成;
B节点(树,对于D、G来说,它就是D、G的根节点),A的左孩子为D,A的左子树右D、G构成,B没有右孩子和右子树
D节点(树,对于G来说,它就是G的根节点)D没有左孩子和左子树,D的右孩子为G,D的右子树由D构成
G节点(叶子节点,个人观点叶子节点可以称为树)
(C、E、F读者可自行分析)
先序序列和中序序列构造二叉树:
图解:
上代码:
#include <stdio.h>#include <stdlib.h>#include <malloc.h>typedef char ElementType ;typedef struct node{ElementType data ;struct node * leftChild ;struct node * rightChild ;}BTNode;//pre:存放先序序列 in:存放中序序列BTNode *createBT(char *pre , char *in ,int n){BTNode *b;char *p ;int k ;if(n<=0)return NULL;b=(BTNode *)malloc(sizeof(BTNode));b->data = *pre ;int j=0;for(p=in;p<in+n;p++){if(*p == *pre)break;}k=p-in; //确定根节点在中序序列(in)中的位置 编号为0,1,2,...,n-1 (类似于数组中的下标号,不是逻辑序号)b->leftChild = createBT(pre+1,in,k); //递归构造左子数b->rightChild = createBT(pre+1+k,p+1,n-k-1); //递归构造右子树return b ;}//先序遍历二叉树BinaryTree:先遍历根节点接着遍历左子树,最后遍历右子树//(不是左孩子节点和右孩子节点,概念要分清哦(虽然节点也是一个树))void showBTPreOrder(BTNode *b){if(b != NULL){//遍历根节点printf("%c",b->data);//遍历左子树showBTPreOrder(b->leftChild);//遍历右子树showBTPreOrder(b->rightChild);}}//中序遍历二叉树BinaryTree:先遍历左子树,接着遍历根节点,左后遍历右子树//(不是左孩子节点和右孩子节点,概念要分清哦(虽然节点也是一个树))void showBTInOrder(BTNode *b){if(b!=NULL){//遍历左子树showBTInOrder(b->leftChild);//遍历根节点printf("%c",b->data);//遍历右子树showBTInOrder(b->rightChild);}}int main(){BTNode *b = NULL ;char pre[] = "ABDGCEF";char in[] = "DGBAECF" ;b=createBT(pre,in,7);//先序遍历遍历二叉树printf("先序遍历遍历二叉树:\n");showBTPreOrder(b);printf("\n");//中序遍历遍历二叉树printf("中序遍历遍历二叉树:\n");showBTInOrder(b);printf("\n");return 0 ;}
程序运行结果:
先序遍历遍历二叉树:
ABDGCEF
中序遍历遍历二叉树:
DGBAECF
Press any key to continue
后序序列和中序序列构造二叉树:
图解:
上代码:
#include <stdio.h>#include <stdlib.h>#include <malloc.h>typedef char ElementType ;typedef struct node{ElementType data ;struct node * leftChild ;struct node * rightChild ;}BTNode;//post:存放后序序列 in:存放中序序列BTNode *createBT(char *post , char *in ,int n){BTNode *b;char *p ,root ; //root:根节点值int k ;if(n<=0)return NULL;root=*(post+n-1) ; //获取根节点的值b=(BTNode *)malloc(sizeof(BTNode));b->data = root ;for(p=in;p<in+n;p++){if(*p == root)break;}k=p-in; //确定根节点在中序序列(in)中的位置(下标号) 编号为0,1,2,...,n-1 (类似于数组中的下标号,不是逻辑序号)b->leftChild = createBT(post,in,k); //递归构造左子数b->rightChild = createBT(post+k,p+1,n-k-1); //递归构造右子树return b ;}//中序遍历二叉树BinaryTree:先遍历左子树,接着遍历根节点,左后遍历右子树//(不是左孩子节点和右孩子节点,概念要分清哦(虽然节点也是一个树))void showBTInOrder(BTNode *b){if(b!=NULL){//遍历左子树showBTInOrder(b->leftChild);//遍历根节点printf("%c",b->data);//遍历右子树showBTInOrder(b->rightChild);}}//后序遍历二叉树BinaryTree:先遍历左子树,接着遍历右子树,左后遍历根节点//(不是左孩子节点和右孩子节点,概念要分清哦(虽然节点也是一个树))void showBTPostOrder(BTNode *b){if(b != NULL){//遍历左子树showBTPostOrder(b->leftChild);//遍历右子树showBTPostOrder(b->rightChild);//遍历根节点printf("%c",b->data);}}int main(){BTNode *b = NULL ;char in[] = "DGBAECF";char post[] = "GDBEFCA" ;b=createBT(post,in,7);//中序遍历遍历二叉树printf("中序遍历遍历二叉树:\n");showBTInOrder(b);printf("\n");//后序遍历遍历二叉树printf("后序遍历遍历二叉树:\n");showBTPostOrder(b);printf("\n");return 0 ;}
程序运行结果:
中序遍历遍历二叉树:
DGBAECF
后序遍历遍历二叉树:
GDBEFCA
Press any key to continue
0 0
- 先序序列和中序序列构造二叉树,中序序列和后序序列构造二叉树
- 由先序序列/后序序列和中序序列构造二叉树
- 根据先序序列和中序序列构造二叉树
- 第十一周项目2 二叉树构造算法--中序序列和后序序列构造二叉树
- 由中序遍历序列和后序遍历序列构造二叉树(递归实现)
- 第十一周项目2 二叉树构造算法--先序序列和中序序列构造算法
- 第十一周项目2 二叉树构造算法--先序序列和中序序列构造算法
- 二叉树序列---根据后序和中序系列或前序和中序序列构造二叉树
- Java先序序列构造二叉树
- 根据二叉树前序序列和中序序列构造二叉树
- 根据二叉树的先序序列和中序序列还原二叉树并打印后序序列
- 根据中序和层次遍历序列,构造二叉树
- 第11周—项目1(2).1由先序序列和中序序列构造二叉树
- 第十一周项目1(2)由先序序列和中序序列构造二叉树
- 第十一周【项目一-(2-1)由先序序列和中序序列构造二叉树】
- 第十周项目1(2)-由先序序列和中序序列构造二叉树
- 第11周项目1-(2)。1由先序序列和中序列构造二叉树
- 通过树的先序和中序遍历序列来构造二叉树
- fl2440添加SD卡驱动
- 翻转二叉树
- jzoj P1667 【AHOI2009】中国象棋
- JAVA:环链表(判断单链表是否存在环)
- 谷歌Android即将跨入8.0时代
- 先序序列和中序序列构造二叉树,中序序列和后序序列构造二叉树
- joda-time的使用
- 怎样才能算得上是技术牛人?
- QT下载
- ubuntu14.04 编译安装OpenCV 3.2
- 判定Java源文件名称
- Unity3d学习 预设体(prefab)的一些理解
- 数据分析 EXCEL
- 腾讯十天前端小白训练营 <DAY 2>作业