[LeetCode] [Study Notes] 105. プレオーダーおよびインオーダートラバーサルシーケンスからバイナリツリーを構築する

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 バイナリ ツリーの順序トラバーサル シーケンスであることが保証されます。

問題解決のアイデア

再帰

  1. ルート ノード(つまり、preorder配列の最初の番号)を見つけます。
  2. ルート ノードに従って、左右のサブツリーを区別します (つまり、inorderルート ノード val に対応する配列の添え字を見つけます)。
    • 左サブツリー子ノード:inorder対応する添字の前のすべての数字。
    • 右サブツリー子ノード:inorder対応する添え字の後のすべての数字。
  3. 子ノードの配列を収集し、それぞれを走査してバイナリ ツリーを形成します。

コード

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;
};

おすすめ

転載: blog.csdn.net/weixin_45944495/article/details/128323670