今天分享一道劍指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變數來記錄 如果根節點為空,則為空樹,也是平衡二叉樹 如果...