劍指offer07 重建二叉樹

2021-10-08 01:46:40 字數 1776 閱讀 8033

這是乙個非常高頻的面試題。

題目:輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。

例子:前序遍歷 preorder = [3,9,20,15,7]

中序遍歷 inorder = [9,3,15,20,7]

思路:題目給出了前序和中序遍歷,我們可以知道前序的遍歷順序為:根節點、左孩子、右孩子;中序:左孩子、根節點、右孩子。可以知道前序遍歷第乙個就是根節點,因此,我們可以在中序遍歷中找出根節點的位置,依據中序遍歷陣列得出:此根節點的左孩子個數,右孩子個數。知道個數之後,根據前序遍歷陣列可以得到左子樹和右子樹的邊界。然後遞迴重複此過程。

使用map用來存放中序遍歷的每個元素和下標位置。中序主要是用來計算左子樹和右子樹的個數,前序依次用來判斷邊界。

截止條件:

1.前序遍歷的下標範圍的開始和結束,如果開始大於結束,則當前二叉樹中沒有結點,返回null;若開始等於結束,二叉樹中恰好只有乙個結點。根據結點值建立該節點作為根節點並返回。

class

solution

//建立乙個map,存入中序遍歷的資訊

mapmap =

newhashmap

();for

(int i=

0;i) treenode root =

buildtree

(preorder,

0,preorder.length-

1,inorder,

0,inorder.length-

1,map)

;return root;

}private treenode buildtree

(int

preorder,

int preorderstart,

int preorderend,

int[

] inorder,

int inorderstart,

int inorderend,map

map)

int rootval = preorder[preorderstart]

; treenode root =

newtreenode

(rootval);if

(preorderstart == preorderend)

//判斷下左右子樹的個數

int rootindex = map.

get(rootval)

;int leftnodes = rootindex - inorderstart;

int rightnodes = inorderend - rootindex;

treenode leftnode =

buildtree

(preorder,preorderstart+

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

1,map)

; treenode rightnode =

buildtree

(preorder,preorderstart+leftnodes+

1,preorderend,inorder,rootindex+

1,inorderend,map)

; root.left = leftnode;

root.right = rightnode;

return root;

}}

劍指 Offer 07 重建二叉樹

難度 中等 題目描述 解題思路 這道題之前做過,但是忘得乾乾淨淨了。現在再做一遍撿一撿,說不定哪次面試就出到了呢 總體思想就是遞迴,用雜湊表來儲存對應的中序遍歷的下標,空間換時間,免得每次都要去遍歷找下標。然後每次遞迴的時候,要給對應的左子樹和右子樹在對應陣列裡的下標,左端點大於右端點的時候返回空。...

劍指 Offer 07 重建二叉樹

首先要懂得前序遍歷和中序遍歷,可以寫出兩個陣列,自己手動來重建一下二叉樹,來看看重建二叉樹是怎麼乙個流程。以圖中給出的二叉樹為例,根據前序遍歷的特點,可知前序遍歷的首尾數字是根節點,比如這個時候根節點數值為3,可以在中序遍歷中第2個位置找到數值3,在3左邊的9為3的左子樹,右邊的15,20,7為右子...

劍指 Offer 07 重建二叉樹

題目 給前序和中序二叉樹序列,建立二叉樹 資料都不重複 主方法宣告 public treenode buildtree int preorder,int inorder 思路 使用遞迴方法build private treenode build int preorder,int preorderst...