前中後序創建樹或者直接歷遍

前中後序創建樹或者直接歷遍

代碼實現

void postOrder(int root,int start,int end)
{
    if (start > end)
        return;
    int index = start;
    while (inOrder[index] != preOrder[root] )
        index++;
    postOrder(root + 1, start, index - 1);
    postOrder(root + index - start + 1, index + 1, end);
    cout << preOrder[root];
    return;
}

簡單介紹:

這時利用前序中序直接輸出後序的函數。直接把輸出語句改爲將數據賦值到節點,就變成一個建樹函數。函數

代碼拓展:後序中序輸出前序函數

void pre_order(int root,int start,int end)
{
    if (start > end)
        return;
    int index = start;
    while (inOrder[index] != postOrder[root])
        index++;
    cout << postOrder[root];
    pre_order(root - end + index - 1, start, index - 1);
    pre_order(root - 1, index + 1, end);
    return;
}

簡單介紹:

做用相同,改爲了後序中序出前序。post

思路:

  1. 參數意義:root爲前序(後序)中根節點的位置,start和end是中序的起點下標和終點下標;code

  2. 遞歸出口:當發現end比start小,說明已經完成,能夠退出了;遞歸

  3. 遞歸主體:class

    • 令index爲start,自加,直到找到根節點在中序序列的位置。總結

    • 輸出或者建樹操做……數據

    • 左子樹參數:while

      • 前轉後co

        root:root+1(前序特色)return

        start:start

        end:index-1(根節點座標前一個是左子樹的end)

      • 後轉前

        root:root-end+index-1(計算右子樹長度爲end-index,減掉以後-1得root座標)

        start:start

        end=index-1

    • 右子樹參數

      • 前轉後

        root:root+index-start+1(左子樹長度爲index-start,加上去以後+1得root座標)

        start:index+1

        end:end

      • 後轉前

        root:root-1(後序特色)

        start:index+1

        end:end

    • 而後return;

  4. 總結:

    將index找到以後,左子樹長度爲index-start,右子樹長度爲end-index。本身分析是是左是右,而後root+length以後再+1或者root-length以後-1;

相關文章
相關標籤/搜索