二叉树的遍历
2016-04-04 21:02
211 查看
1、前序遍历(父节点,左孩子,右孩子)。
2、中序遍历(左孩子,父节点,右孩子)。
3、后序遍历(左孩子,右孩子,父节点)。
提醒:根据前序遍历和后序遍历结果不可以推导出原来的二叉树。根据中序遍历和其它两种任意一个都可以推导出二叉树。
1、根据中序、前序求出原来的树。
2、根据中序、后序求出原来的树。
注意:两个函数的第三个参数的不同含义。
如给出的三个数组,调用treeFromMF需要传递(0,6,0,0);而调用treeFromMB需要传递(0,6,6,0)
#define N 7 //树节点个数 int tree ={a,b,c,d,e,f,g}; //自定义节点编号 void foreIterator(int root) { if(root >= N) return; printf("%d ",tree[root]); //这里可以替换成自己的处理函数 foreIterator(2*root+1); foreIterator((2*root+2)); } //下面的函数省略N tree定义 //调用时foreIterator(0);这里的root指数组下标,从0开始
2、中序遍历(左孩子,父节点,右孩子)。
void middIterator(int root) { if(root >= N) return; middIterator(2*root+1); printf("%d ",tree[root]); middIterator((2*root+2)); }
3、后序遍历(左孩子,右孩子,父节点)。
void backIterator(int root) { if(root >= N) return; backIterator(2*root+1); backIterator((2*root+2)); printf("%d ",tree[root]); }
提醒:根据前序遍历和后序遍历结果不可以推导出原来的二叉树。根据中序遍历和其它两种任意一个都可以推导出二叉树。
1、根据中序、前序求出原来的树。
#define N 7 int fore ={0,1,3,4,2,5,6}; int midd ={3,1,4,0,5,2,6}; int back ={3,4,1,5,6,2,0}; int tree ={-1,-1,-1,-1,-1,-1,-1}; //在方法内将会使用上面定义的内容,也可以使用其它方式 void treeFromMF(int ms,int me,int fs,int index) { /* 参数含义: ms -> 中序数组表示的树的起点 me -> 中序数组表示的树的终点 fs -> 前序数组表示的树的起点 index -> tree数组索引 */ if(ms<0||ms>=N||me<0||me>=N||fs<0||fe>=n||index<0||index>=N) return; int i; for(i=ms; i<=me; i++) //根据前序数组将中序数组拆分为左子树右子树 if(midd[i] == fore[fs]) break; tree[index] = fore[fs]; //将父元素保存进tree treeFromFM(ms,i-1,fs+1,2*index+1); //计算左子树起终点 treeFromFM(i+1,me,fs+i-ms+1,2*index+2);//计算右子树 }
2、根据中序、后序求出原来的树。
void treeFromMB(int ms,int me,int be,int index) { /* 参数含义: ms me index -> 同上 be -> 后序数组终点 */ if(ms<0||ms>=N||me<0||me>=N||be<0||be>=N||index<0||index>=N) return; int i; for(i=ms; i<=me; i++) if(midd[i] == back[be]) break; tree[index] = back[be]; treeFromBM(ms,i-1,be+i-me-1,2*index+1); // be+i-me-1 treeFromBM(i+1,me,be-1,2*index+2);//be-me+i }
注意:两个函数的第三个参数的不同含义。
如给出的三个数组,调用treeFromMF需要传递(0,6,0,0);而调用treeFromMB需要传递(0,6,6,0)
相关文章推荐
- AVL树-自平衡二叉查找树(Java实现)
- 文件遍历排序函数
- C#数据结构之顺序表(SeqList)实例详解
- Lua 学习笔记之C API 遍历 Table实现代码
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#遍历文件夹后上传文件夹中所有文件错误案例分析
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#中遍历Hashtable的4种方法
- C#数据结构之单链表(LinkList)实例详解
- Erlang中遍历取出某个位置的最大值代码
- 数据结构之Treap详解
- C++实现图的邻接矩阵存储和广度、深度优先遍历实例分析
- C++实现图的邻接表存储和广度优先遍历实例分析
- C语言二叉树的非递归遍历实例分析
- 使用C语言构建基本的二叉树数据结构
- 一波二叉树遍历问题的C++解答实例分享
- C++非递归队列实现二叉树的广度优先遍历
- 【数据结构与算法】数组应用4:多项式计算Java版