二叉树的前序、中序、后序三种中的两种推另一种

版权声明:iQXQZX https://blog.csdn.net/Cherishlife_/article/details/84976746

关于二叉树:

二叉树之由 中序、后序推前序:

char s1[100], s2[100], ans[100];
int cnt;
/*以上为全局变量*/
void make(int len, char *s1, char *s2) // 中序、后序 推前序 s1中序s2后序
{
    if (len <= 0)
        return;
    int i = strchr(s1, s2[len - 1]) - s1; // 从s1中搜索s2[len-1] 并返回地址,地址减去首地址即为子树长度
    ans[cnt++] = s2[len - 1];
    make(i, s1, s2);                       // 递归搜索左子树
    make(len - i - 1, s1 + i + 1, s2 + i); //递归搜素右子树 存到地址之后
}
// ans为目的串

二叉树之由 前序、中序推前序:

char s1[100], s2[100], ans[100];
int cnt;
/*以上为全局变量*/
void make(int len, char *s1, char *s2, char *s) // 先序、中序推后序  s1为先序 s2为中序 
{
    int i;
    if (len <= 0)
        return; // return 必不可少 否则死循环
    else
    {
        for (i = 0; i < len; i++)
        {
            if (s1[0] == s2[i]) // 在中序中搜索根节点 实现递归
                break;
        }
    }
    // 关键部分
    make(i, s1 + 1, s2, ans);                           // 搜索上次搜索左侧部分
    make(len - i - 1, s1 + i + 1, s2 + i + 1, ans + i); // 搜索上次搜索右侧部分
    ans[len - 1] = s1[0];                             // 后序输出 把递归找出的根节点从后存入
}

// ans为目的串

猜你喜欢

转载自blog.csdn.net/Cherishlife_/article/details/84976746