輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。
例如,給出
前序遍歷 preorder =[3
,9,20
,15,7
]中序遍歷 inorder =[9
,3,15
,20,7
]返回如下的二叉樹:
3/ \ 9
20/ \157
限制:
0 <= 節點個數 <= 5000
前序遍歷中,第乙個數字是二叉樹的根節點
中序遍歷中,根節點的左側是左子樹的節點,根節點的右側是右子樹的節點。
/**
* definition for a binary tree node.
* struct treenode
* };
*/class
solution
}// 先序遍歷和中序遍歷的左右子樹vector
vector<
int> left_pre,left_in,right_pre,right_in;
for(
int i=
0;i)for
(int i=root+
1;isize()
;i++
)// 根節點的左右節點
head-
>left =
buildtree
(left_pre,left_in)
; head-
>right =
buildtree
(right_pre,right_in)
;return head;}}
;
改進:
中序序列可以使用雜湊表儲存,便於查詢根節點,引數傳入可以為前序,中序,前序序列根節點,中序序列左邊界,中序序列右邊界
/**
* definition for a binary tree node.
* struct treenode
* };
*/class
solution
treenode*
build
(vector<
int>
& preorder, vector<
int>
& inorder,
int pre_root,
int in_left,
int in_right)
};
class
solution
else
cur = cur-
>right =
newtreenode
(preorder[i]);
//preorder[i]即當前節點的右子樹節點,並且下次從右子樹開始遍歷}}
return root;}}
;
劍指offer07 重建二叉樹
這是乙個非常高頻的面試題。題目 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例子 前序遍歷 preorder 3,9,20,15,7 中序遍歷 inorder 9,3,15,20,7 思路 題目給出了前序和中序遍歷,我們可以知道前序的...
劍指 Offer 07 重建二叉樹
難度 中等 題目描述 解題思路 這道題之前做過,但是忘得乾乾淨淨了。現在再做一遍撿一撿,說不定哪次面試就出到了呢 總體思想就是遞迴,用雜湊表來儲存對應的中序遍歷的下標,空間換時間,免得每次都要去遍歷找下標。然後每次遞迴的時候,要給對應的左子樹和右子樹在對應陣列裡的下標,左端點大於右端點的時候返回空。...
劍指 Offer 07 重建二叉樹
首先要懂得前序遍歷和中序遍歷,可以寫出兩個陣列,自己手動來重建一下二叉樹,來看看重建二叉樹是怎麼乙個流程。以圖中給出的二叉樹為例,根據前序遍歷的特點,可知前序遍歷的首尾數字是根節點,比如這個時候根節點數值為3,可以在中序遍歷中第2個位置找到數值3,在3左邊的9為3的左子樹,右邊的15,20,7為右子...