《劍指Offer》4 重建二叉樹

2021-09-10 21:25:17 字數 1505 閱讀 1544

題目:4. 重建二叉樹

知識點:二叉樹

題目描述:

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。

解題思路:

兩種解法的解題思路是相同的,只不過實現方式不同,解法一是通過陣列下標進行實現,而解法二是通過指標來實現的,解法二的**的魯棒性更好,一些特殊情況需要重點記憶。

解題的思路即首先前序陣列中首個元素即為當前二叉樹的跟,所以先將根結點建立,然後在中序陣列中查詢此根節點,在中序陣列中查詢到根節點的位置後,根節點在中序陣列中左側的元素即為其左結點,其右側的元素即為其右結點,明確了這點之後再通過遞迴,分別構建其左右子樹即可。

**:

//解法一(自研):

treenode* reconstructbinarytree(vectorpre,vectorvin)

treenode* reconstruct(vectorpre,vectorvin, int prestart, int preend, int vinstart, int vinend)

//解法二(劍指offer):

binarytreenode* constructcore(int* startpreorder, int* endpreorder, int* startinorder, int* endinorder);

binarytreenode* construct(int* preorder, int* inorder, int length)

binarytreenode* constructcore

( int* startpreorder, int* endpreorder,

int* startinorder, int* endinorder

) // 在中序遍歷中找到根結點的值

int* rootinorder = startinorder;

while(rootinorder <= endinorder && *rootinorder != rootvalue)

++ rootinorder;

if(rootinorder == endinorder && *rootinorder != rootvalue)

throw std::exception("invalid input.");

int leftlength = rootinorder - startinorder;

int* leftpreorderend = startpreorder + leftlength;

if(leftlength > 0)

if(leftlength < endpreorder - startpreorder)

return root;

}

劍指offer4 重建二叉樹

給出前序遍歷和中序遍歷,重新構建二叉樹.重建二叉樹主要就是遞迴,每一次新增乙個結點進入二叉樹,保證遞迴的順序和前序遍歷順序一致就ok了,多以左子樹的遞迴在前面,右子樹的遞迴放在後面,和前序遍歷的順序一致,第一次遞迴新增前序遍歷陣列中的第乙個,第二次遞迴新增的是前序遍歷陣列中的第二個.第n個就是陣列中...

劍指offer 4 重建二叉樹

題目描述 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。思路 中序序列中,節點左邊為左子樹,右邊為右子樹。前序第乙個為根節點 12 4 7 3 5 6 8 左 4 7 215 3...

劍指offer 4 重建二叉樹

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。演算法設計思想 前序遍歷序列的第乙個元素為根結點的值,然後在中序遍歷序列中尋找根節點的值的位置 索引 從中序遍歷序列的起始位置到根結...