二叉树的遍历

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 7

int 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值