【leetcode C語言實(shí)現(xiàn)】劍指 Offer 07.重建二叉樹

題目描述

輸入某二叉樹的前序遍歷和中序遍歷的結(jié)果,請重建該二叉樹。假設(shè)輸入的前序遍歷和中序遍歷的結(jié)果中都不含重復(fù)的數(shù)字。

例如,給出

前序遍歷 preorder = [3,9,20,15,7]
中序遍歷 inorder = [9,3,15,20,7]
返回如下的二叉樹:



限制:

0 <= 節(jié)點(diǎn)個(gè)數(shù) <= 5000

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/zhong-jian-er-cha-shu-lcof

解題思路

前序遍歷的第一個(gè)節(jié)點(diǎn)即為該二叉樹的根節(jié)點(diǎn),其后分別是左子樹節(jié)點(diǎn)和右子樹節(jié)點(diǎn),但是前序遍歷無法區(qū)分左子樹和右子樹的分界;中序遍歷的根節(jié)點(diǎn)在序列中間,根節(jié)點(diǎn)左側(cè)為左子樹節(jié)點(diǎn),后側(cè)為右子樹節(jié)點(diǎn),這樣結(jié)合前序遍歷和中序遍歷的根節(jié)點(diǎn)可以把原始序列分別劃分為左子樹和右子樹序列,同樣,這兩段序列可以按照前面一樣的方法進(jìn)行節(jié)點(diǎn)確認(rèn),最終能重建二叉樹。

代碼

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */


struct TreeNode* buildTree(int* preorder, int preorderSize, int* inorder, int inorderSize){
    if(preorderSize == 0)  return NULL;

    int index = 0; 
    struct TreeNode* pnode=malloc(sizeof(struct TreeNode));    
    pnode->val = preorder[0];
    while(index < inorderSize)
    {
        if(inorder[index] == preorder[0])  break;
        else index++;
    }
    pnode->left = buildTree(preorder + 1, index, inorder, index);
    pnode->right = buildTree(preorder + 1 + index, preorderSize - index - 1, inorder + index + 1, preorderSize - index - 1);

    return pnode;
}

執(zhí)行結(jié)果

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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