lintcode 73:前序遍歷和中序遍歷樹構造二叉樹

題目描述

根據(jù)前序遍歷和中序遍歷樹構造二叉樹.

樣例

給出中序遍歷:[1,2,3]和前序遍歷:[2,1,3]. 返回如下的樹:

  2
 / \
1   3

思路

先序遍歷的第一個數(shù)為根值,在中序遍歷的數(shù)組中找到該值,并則在該值左邊為其左子樹,右邊為其右子樹。

實現(xiàn)

/**
 * @param preorder : 樹的先序遍歷列表
 * @param inorder :  樹的中序遍歷列表
 * @return : Root of a tree
 */

/**
 
 使用先序遍歷和中序遍歷構造樹的遞歸方法

 @param preorder 樹的先序遍歷列表
 @param inorder 樹的中序遍歷列表
 @param preStart 樹的先序遍歷列表起始位置
 @param preEnd 樹的先序遍歷列表結束位置
 @param inStart 樹的中序遍歷列表起始位置
 @param inEnd 樹的中序遍歷列表結束位置
 @return 根節(jié)點
 */
TreeNode * buildTreeCore(vector<int> &preorder, vector<int> &inorder,int preStart, int preEnd, int inStart, int inEnd){
    
    //構造根節(jié)點
    int rootVal = preorder[preStart];
    TreeNode *root = new TreeNode(rootVal);
    if (preStart == preEnd) {
        return root;
    }
    
    //找到在中序遍歷中的根節(jié)點
    int indexOfRoot = inStart;
    while (rootVal != inorder[indexOfRoot] && indexOfRoot < inEnd) {
        indexOfRoot++;
    }
    
    //判斷是否存在左子樹,若有則遞歸構造左子樹
    if (indexOfRoot > inStart) {
        root -> left = buildTreeCore(preorder, inorder, preStart + 1, preStart + (indexOfRoot - inStart), inStart, indexOfRoot - 1);
    }
    
    //判斷是否存在右子樹,若有則遞歸構造右子樹
    if (indexOfRoot < inEnd) {
        root -> right = buildTreeCore(preorder, inorder, preStart + (indexOfRoot - inStart) + 1, preEnd, indexOfRoot+1, inEnd);
    }
    
    return root;
}

/**
 使用先序遍歷和中序遍歷構造樹

 @param preorder 樹的先序遍歷列表
 @param inorder 樹的中序遍歷列表
 @return 根節(jié)點
 */
TreeNode* buildTree(vector<int> &preorder, vector<int> &inorder) {
    //參數(shù)檢查
    if (preorder.size() <= 0 ||
        inorder.size() <= 0  ||
        preorder.size() != inorder.size()) {
        return NULL;
    }
    
    TreeNode *root = buildTreeCore(preorder, inorder, 0, (int)preorder.size()-1, 0, (int)inorder.size() - 1);
    return root;
}
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容