劍指 Offer 07 重建二叉樹

2021-10-10 17:52:47 字數 3052 閱讀 1755

題目:給前序和中序二叉樹序列,建立二叉樹(資料都不重複)

主方法宣告:public treenode buildtree(int preorder, int inorder)

思路:使用遞迴方法build()

private treenode build(int preorder, int preorderstart, int preorderend, int inorder, int inorderstart, int inorderend, mapindexmap)

因為樹的操作大部分都要使用遞迴。map是的key是放inorder裡的值,value是放inorder對應的下標。方便通過值在inorder裡找到rootindex。

把root.left = build(…)和root.right = build(…)寫好。

build遞迴結束的條件是當preorderstart超過preorderend。因為preorderstart不斷往右走,就不斷在inorder裡確定子樹的根。把整體串起來。

public treenode buildtree

(int

preorder,

int[

] inorder)

//map用來快速通過inorder的值來得到下標(為rootindex)

mapindexmap =

newhashmap

<

>()

;for

(int i =

0; i < inorder.length; i++

) treenode root =

build

(preorder,

0,preorder.length-

1,inorder,

0,inorder.length-

1,indexmap)

;return root;

}private treenode build

(int

preorder,

int preorderstart,

int preorderend,

int[

] inorder,

int inorderstart,

int inorderend, map

indexmap)

treenode root =

newtreenode

(preorder[preorderstart]);

int rootindex = indexmap.

get(root.val)

; root.left =

build

(preorder,preorderstart+

1,preorderstart+rootindex-inorderstart,inorder,inorderstart,rootindex-

1,indexmap)

; root.right =

build

(preorder,preorderstart+rootindex-inorderstart+

1,preorderend,inorder,rootindex+

1,inorderend,indexmap)

;return root;

}

擴充套件:給後序和中序,自己寫一遍

leetcode 106題

思路:postorder序列最右邊的是root。只需要把root.left和root.right重寫一下,其它不變。

public treenode buildtree

(int

postorder,

int[

] inorder)

//map用來快速通過inorder的值來得到下標(為rootindex)

mapindexmap =

newhashmap

<

>()

;for

(int i =

0; i < inorder.length; i++

) treenode root =

build

(postorder,

0,postorder.length-

1,inorder,

0,inorder.length-

1,indexmap)

;return root;

}private treenode build

(int

postorder,

int postorderstart,

int postorderend,

int[

] inorder,

int inorderstart,

int inorderend, map

indexmap)

//後序遍歷中最右邊那個節點為root

treenode root =

newtreenode

(postorder[postorderend]);

int rootindex = indexmap.

get(root.val)

; root.left =

build

(postorder,postorderstart,postorderstart+rootindex-inorderstart-

1,inorder,inorderstart,rootindex-

1,indexmap)

; root.right =

build

(postorder,postorderstart+rootindex-inorderstart,postorderend-

1,inorder,rootindex+

1,inorderend,indexmap)

;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為右子...