重構二叉樹

2021-10-06 06:23:19 字數 1646 閱讀 7705

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

分析:給了我們一顆二叉樹的前序遍歷和中序遍歷,則我們根據兩個遍歷的遍歷方式來思考如何重構。已知preorder:vlr,inorder:lvr。所以,很顯然,preorder可以找到樹的根節點,而有了根節點再看inorder,我們就能夠清楚根節點的左子樹inorder序列,和右子樹inorder序列,再比對preorder,得到其左子樹preorder序列,右子樹preorder序列。這樣,問題就分解成重構根節點的左子樹,重構根節點的右子樹,典型的遞迴思想,所以最後用遞迴再次分解問題。

**如下:

class

solution

treenode *proot =

newtreenode

(pre[0]

);int lefttreelength =0;

for(

int i =

0; vin[i]

!= pre[0]

;++i)

int righttreelength = pre.

size()

- lefttreelength -1;

vector<

int>

lefttreepre

(lefttreelength)

; lefttreepre.

assign

(pre.

begin()

+1, pre.

begin()

+ lefttreelength +1)

; vector<

int>

lefttreevin

(lefttreelength)

; lefttreevin.

assign

(vin.

begin()

, vin.

begin()

+ lefttreelength)

; vector<

int>

righttreepre

(righttreelength)

; righttreepre.

assign

(pre.

begin()

+ lefttreelength +

1, pre.

end())

; vector<

int>

righttreevin

(righttreelength)

; righttreevin.

assign

(vin.

begin()

+ lefttreelength +

1, vin.

end())

; proot-

>left =

reconstructbinarytree

(lefttreepre, lefttreevin)

; proot-

>right =

reconstructbinarytree

(righttreepre, righttreevin)

;return proot;}}

;

二叉樹重構

問題描述 根據前序遍歷結果和中序遍歷結果,重構二叉樹。1 前序遍歷結果的特點 假設當前的遍歷結果是完整的樹節點集合。那麼第乙個節點就是該樹的根節點,並且其後面的節點集合中,前半部分是其左子樹的節點集合,後半部分是其右子樹的節點集合。2 中序遍歷結果的特點 如果當前節點是當前樹的根節點,那麼該節點左邊...

重構二叉樹

重構二叉樹的思路主要是首先在前序 後序 序列中找到根結點,然後在中序序列中找到根結點所在的位置,該結點將整個序列分成兩個部分,前一部分為根結點的左子樹元素,後一部分為根結點的右子樹元素。再遞迴的生成左子樹和右子樹即可。1.通過前序,中序序列重構二叉樹 treenode buildtree vecto...

二叉樹重構

先驗知識 前序 第乙個數就是根節點 中序 根節點位於中間,剛好將其左右子樹分開 運用方法 遞迴 找到根節點,將其數值放入value,遞迴的分別根據左右子樹進行二叉樹重建 根據函式已有的介面,因此,需要將左 右 子樹的前序,中序分別用vector進行賦值 最後遞迴的對左右進行重建,方法一樣 關鍵 易錯...