輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。
首先要知道二叉樹的三種遍歷方式:先序、中序、後序
先序:根左右
中序:左根右
後序:左右根
如何根據先序和中序(或者中序和後續)重建二叉樹?(先序和後序的組合是不能建立一棵唯一的二叉樹)
先序中序
1,2,4,7,3,5,6,8
4,7,2,1,5,3,8,6
根據先序遍歷可以知道,1一定是根結點,再根據中序遍歷,可以分出1結點的左右子樹——4,7,2一定是屬於左子樹,5,3,8,6一定是屬於右子樹,並且這也是左右子樹的中序遍歷。再從先序遍歷中找到左右子樹的先序遍歷。
先序中序
2,4,7
4,7,2
3,5,6,8
5,3,8,6
這樣問題就變成如何根據左右子樹的先序中序遍歷重建左右子樹了,層層遞迴下去,當vector裡面沒有元素的時候,返回空指標。
總結起來,要清楚的地方是如何使用遞迴,以及如何劃分左右子樹的元素。
class
solution
for(
int i=
0;i)//得到左子樹相關陣列,這裡注意取先序的時候下標要+1
for(
int i=pos+
1;isize()
;i++
)//得到右子樹相關陣列
ret-
>left=
reconstructbinarytree
(pre_l, vin_l)
;//遞迴建立左子樹
ret-
>right=
reconstructbinarytree
(pre_r, vin_r)
;//遞迴建立右子樹
return ret;}}
;
1.樹的遍歷
2.遞迴
劍指Offer(04) 重建二叉樹
輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。通常樹有如下幾種遍歷方式 前序遍歷 先訪問根節點,再訪問左子節點,最後訪問右子節點。中序遍歷 先訪問左子節點,再訪問根節點,最後訪問...
劍指offer04 重建二叉樹
題目 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。思路 設前序遍歷序列為pre,中序遍歷序列為in,則易知 1 root pre 0 2 in 中 root 的位置 索引 將 ...
劍指offer04重建二叉樹
輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。通過前序的第乙個點,對中序切分 左半邊和右半邊,然後對前序也切分為左半邊和右半邊,遞迴 definition for binary ...