劍指offer 03 重建二叉樹

2021-09-19 21:06:06 字數 1562 閱讀 3925

今天分享一道劍指offer的題:重建二叉樹

題目描述:

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

解題分析:

題目中要求利用二叉樹的前序和中序遍歷結果重建二叉樹,既然是重建在c++裡面那肯定要用到new來動態申請記憶體,首先要判斷先序是否為空,為空則直接返回,不為空的話,先序遍歷的第乙個元素為該二叉樹的根,然後在中序序列中查詢根的位置,根左邊的為左子樹區域,根右邊的為右子樹區域,然後左右子樹再遞迴該函式來建立,要注意的就是每次遞迴的左子樹的前序序列的起始位置就是之前的pre序列起始位置加一,終止位置就是在加上左子樹用掉的元素個數也就是leftsize,右子樹類似看**就能理解,**還是相對直觀好理解的。

實現**:

class solution 

treenode*

reconstruct

(const vector<

int>

& pre,

const vector<

int>

& vin)

int rootvalue = pre[0]

; treenode* ptr = new treenode

(rootvalue)

;//根

auto vindex =

find

(vin.

begin()

,vin.

end(

),rootvalue)

;//在中序裡找到根的位置

int leftsize = vindex - vin.

begin()

;//左子樹在中序中佔的結點個數

ptr->left =

reconstruct

(vector<

int>

(pre.

begin()

+1,pre.

begin()

+1+leftsize)

, vector<

int>

(vin.

begin()

,vin.

begin()

+leftsize));

//建立左子樹

ptr->right =

reconstruct

(vector<

int>

(pre.

begin()

+1+leftsize,pre.

end())

, vector<

int>

(vin.

begin()

+leftsize+

1,vin.

end())

);//建立右子樹

return ptr;}}

;

4 重建二叉樹(劍指offer)

4.重建二叉樹 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。1 思路 通常樹有如下幾種遍歷方式 前序遍歷 先訪問根結點,再訪問左子結點,最後訪問右子結點。root一般在最前 中...

劍指offer 樹 7 重建二叉樹

使用雜湊表map記錄中序遍歷每個元素的位置 利用性質 1.先序遍歷的第乙個節點是根節點 2.中序遍歷的根節點的左邊是左子樹,右邊是右子樹 假設左子樹的中序遍歷的長度是len,在前序遍歷中,根節點後面len個數,是左子樹的前序遍歷,剩下的數是右子樹的前序遍歷 根據左右子樹的前序遍歷和中序遍歷,我們先遞...

劍指offer 03 平衡二叉樹

輸入一棵二叉樹,判斷該二叉樹是否是平衡二叉樹。平衡二叉樹是任意節點的左右子樹深度相差不超過1 盡量不用暴力的思路,在每乙個節點計算其左右節點的深度,會造成重複的浪費 用遞迴的思想 用後序遍歷的方法,先遍歷其左右子樹,用乙個left與right變數來記錄 如果根節點為空,則為空樹,也是平衡二叉樹 如果...