劍指offer04 重建二叉樹

2021-10-18 22:33:51 字數 1004 閱讀 2588

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

首先要知道二叉樹的三種遍歷方式:先序、中序、後序

先序:根左右

中序:左根右

後序:左右根

如何根據先序和中序(或者中序和後續)重建二叉樹?(先序和後序的組合是不能建立一棵唯一的二叉樹)

先序中序

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 ...