二叉树的构造
2015-12-15 18:44
197 查看
我们假设二叉树中每个节点的值都不相同,那么二叉树具有唯一的先序序列、中序序列、后序序列(注意不同的二叉树可能有相同的先序、中序、后序序列)。引入如下两个定理(数学归纳法很容易可以证明,这里不给出证明):
1.任何n(n≥0)个不同节点的二叉树,都可由它的中序序列和先序序列唯一确定。
1.任何n(n≥0)个不同节点的二叉树,都可由它的中序序列和后序序列唯一确定。
给出二叉树的两个序列,返回出二叉树的根结点,代码如下:
1.任何n(n≥0)个不同节点的二叉树,都可由它的中序序列和先序序列唯一确定。
1.任何n(n≥0)个不同节点的二叉树,都可由它的中序序列和后序序列唯一确定。
给出二叉树的两个序列,返回出二叉树的根结点,代码如下:
/* Author:Ibsen Date:2015.12.15 */ #include <iostream> using namespace std; const int M=1000; typedef struct node { char data; struct node *lc,*rc; }BTree; BTree* Creat_BTree_pre_in(char *pre,char *in,int n) { BTree *h; char *p; if(n<=0) return NULL; h=new BTree(); h->data=*pre; for(p=in;p<in+n;p++) if(*p==*pre) break; int pos=p-in; h->lc=Creat_BTree_pre_in(pre+1,in,pos); h->rc=Creat_BTree_pre_in(pre+1+pos,p+1,n-1-pos); return h; } BTree* Creat_BTree_in_post(char *in,char *post,int n) { BTree *h; char *p; if(n<=0) return NULL; h=new BTree(); h->data=*(post+n-1); for(p=in;p<in+n;p++) if(*p==h->data) break; int pos=p-in; h->lc=Creat_BTree_in_post(in,post,pos); h->rc=Creat_BTree_in_post(p+1,post+pos,n-1-pos); return h; } void Display_BTree(BTree *h) { if(h!=NULL) { cout<<h->data; if(h->lc!=NULL||h->rc!=NULL) { cout<<"("; Display_BTree(h->lc); if(h->rc!=NULL) cout<<","; Display_BTree(h->rc); cout<<")"; } } } char pre[M],in[M],post[M]; //先序,中序,后序序列 int main() { int n; //节点个数 BTree *h; while(cin>>n) { cin>>pre>>in>>post; h=Creat_BTree_pre_in(pre,in,n); Display_BTree(h); cout<<endl; h=Creat_BTree_in_post(in,post,n); Display_BTree(h); cout<<endl; } return 0; }
相关文章推荐
- C语言03
- 从零开始学算法——选择排序
- 应用数据plist存储方法
- Android 权限 一览表
- C语言02
- 【六】MongoDB管理之副本集
- Java面试题—try语句中执行return语句
- 前端mock数据
- 矛盾人生
- java中Map的简单运用
- iOS 解决图片方向不正常的问题
- Android 布局类控件
- 面向对象(Java中普通代码块,构造代码块,静态代码块区别及代码示例)
- mdf与ldf文件如何还原到SQLserver数据库
- android 二维码扫描界面 canvas drawText 换行居中
- Android Intent Action 一览表
- ajax php 验证注册用户名是否存在
- C语言01
- Swift -- Swift 2.0值得注意的新特性
- 为Debian 8 的iceweasel浏览器安装flash player