劍指offer(四) 重建二叉樹

2021-09-16 13:40:34 字數 995 閱讀 7449

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

.例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。

我們先來弄懂前序遍歷和中序遍歷的特點:

前序遍歷:根結點、左子樹、右子樹。

中序遍歷:左子樹、根結點、右子樹。

所以前序遍歷序列的第乙個值肯定是根結點,而該結點可以將中序遍歷分成左子樹的中序遍歷和右子樹的中序遍歷序列。

而左子樹的根結點恰好在前序遍歷序列中根結點的下乙個位置,於是也可以用來分割左子樹的中序遍歷序列。

而前序遍歷序列中,當左子樹的序列結束後,緊接著第乙個結點即是右子樹的根結點,可以用來分割右子樹的中序遍歷序列。

至此,乙個遞迴的雛形出來了。我們可以嘗試使用遞迴解決這個問題。

/**

* definition for binary tree

* public class treenode

* }*/public

class

solution

//pl、pr表示子前序序列在原陣列pre中的起始下標;il、ir表示子中序序列在原陣列in中的起始下標

public treenode reconstruct

(int [

]pre, int pl, int pr, int in

, int il, int ir)

root.left =

reconstruct

(pre, pl+

1, index-il+pl,

in, il, index-1)

; root.right =

reconstruct

(pre, index-il+pl+

1, pr,

in, index+

1, ir)

;return root;

}}

劍指Offer 四 重建二叉樹

解法1 前序遍歷的第乙個數為樹的根,而中序遍歷中根所在位置的左面的序列即為左子樹的中序遍歷,右面即為右子樹的中序遍歷,遞迴找到每個子樹的根就ok了!class solution 返回構造的treenode根節點 def reconstructbinarytree self,pre,tin write...

劍指Offer 四 重建二叉樹

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。coding utf 8 class treenode def init self,x self.val x self.left n...

劍指offer(四) 重建二叉樹

題目描述 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。題解 已知前序遍歷和中序遍歷求二叉樹。我們需要找到前序遍歷陣列pre和中序遍歷陣列in確定二叉樹的規律。根據前序遍歷的性質...