1.タイトル説明
そして、バイナリツリーの再構築の先行順走査でのバイナリツリーの先行順走査で結果を入力してください。仮定結果先行順トラバーサル順序と重複する数字の入力は無料です。入射例えばプレオーダートラバーサルシーケンス{1,2,4,7,3,5,6,8}及び{4,7,2,1,5,3,8,6}順序トラバーサル順序、及び再構成された二分木前リターン。
2.再帰的な問題解決
2.1分析
先行順走査:ルート→→左と右の
前順:ルート→→左右
- 配列プレオーダートラバーサルプレによって= {1,2,4,7,3,5,6,8}既知のルートノードです。
- 次に= {4,7,2,1,5,3,8,6} 1が見つかり順序トラバーサル順序で、それらは左サブツリーの位置を知っているであろう権利が正しい場所で、残っている1サブツリーを得ることができ、左サブツリー右サブツリー、それぞれ3及び4の長さ。
- 再帰呼び出し:次いで、ツリー、左サブツリー及び右サブツリーとしてそれぞれプレオーダー左サブツリー及び右サブツリーのルートノード、各ノードおよび先行順走査を見つけるために、ルートノードの左の部分木が見つかりました。
- 左サブツリー例における長さ3の、{4,7,2}、その後、対応するプリオーダールート要素3は、これら3つの要素2を通過した後、左の部分木を順次ルートノードであります再帰。
2.2コード
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
class Solution:
# 返回构造的TreeNode根节点
def reConstructBinaryTree(self, pre, tin):
# write code here
if len(pre) == 0:
return None
elif len(pre) == 1:
return TreeNode(pre[0])
else:
tree = TreeNode(pre[0])
rootindex = tin.index(pre[0])
tree.left = self.reConstructBinaryTree(pre[1:rootindex+1], tin[:rootindex])
tree.right = self.reConstructBinaryTree(pre[rootindex+1:], tin[rootindex+1:])
return tree