1. 程式人生 > >二叉樹的前序、中序、後序三種中的兩種推另一種

二叉樹的前序、中序、後序三種中的兩種推另一種

關於二叉樹:

二叉樹之由 中序、後序推前序:

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為目的串