二叉树的遍历

来源:互联网 发布:软件升级包 编辑:程序博客网 时间:2024/05/21 22:33

1、前序遍历(父节点,左孩子,右孩子)。

#define N 7 //树节点个数int tree[N]={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 7int fore[N]={0,1,3,4,2,5,6};int midd[N]={3,1,4,0,5,2,6};int back[N]={3,4,1,5,6,2,0};int tree[N]={-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)

0 0