105. プレオーダーおよびインオーダートラバーサルシーケンスからバイナリツリーを構築する
2 つの整数配列preorder
と が与えられたinorder
場合、はpreorder
バイナリ ツリーの事前順序走査、はinorder
同じツリーの順序トラバーサルです。バイナリ ツリーを構築し、そのルート ノードを返します。
例 1:
输入: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
输出: [3,9,20,null,null,15,7]
例 2:
输入: preorder = [-1], inorder = [-1]
输出: [-1]
ヒント:
1 <= preorder.length <= 3000
inorder.length == preorder.length
-3000 <= preorder[i], inorder[i] <= 3000
preorder
繰り返し要素はありませんinorder
inorder
どちらも登場するのは、preorder
preorder
バイナリ ツリーのプリオーダー トラバーサル シーケンスであることが保証されます。inorder
バイナリ ツリーの順序トラバーサル シーケンスであることが保証されます。
問題解決のアイデア
再帰
- ルート ノード(つまり、
preorder
配列の最初の番号)を見つけます。 - ルート ノードに従って、左右のサブツリーを区別します (つまり、
inorder
ルート ノード val に対応する配列の添え字を見つけます)。- 左サブツリー子ノード:
inorder
対応する添字の前のすべての数字。 - 右サブツリー子ノード:
inorder
対応する添え字の後のすべての数字。
- 左サブツリー子ノード:
- 子ノードの配列を収集し、それぞれを走査してバイナリ ツリーを形成します。
コード
var buildTree = function(preorder, inorder) {
if(preorder.length===0) return null;
let rootNode=preorder[0];
let leftLength=inorder.indexOf(rootNode);
let root=new TreeNode(rootNode);
root.left=buildTree(preorder.slice(1,leftLength+1),inorder.slice(0,leftLength));
root.right=buildTree(preorder.slice(leftLength+1),inorder.slice(leftLength+1));
return root;
};