106. Construct Binary Tree from Inorder and Postorder Traversal
Даны два массива целых чисел: inorder и postorder, где inorder — это массив обхода в глубину бинарного дерева слева направо, а postorder — это массив обхода в глубину после обработки всех потомков узла. Постройте и верните соответствующее бинарное дерево.
Пример:
Input: inorder = [9,3,15,20,7], postorder = [9,15,7,20,3]
Output: [3,9,20,null,null,15,7]
C# решение
сопоставлено/оригиналpublic class Solution {
int post_idx;
int[] postorder;
int[] inorder;
Dictionary<int, int> idx_map = new Dictionary<int, int>();
public TreeNode Helper(int in_left, int in_right) {
if (in_left > in_right)
return null;
int root_val = postorder[post_idx];
TreeNode root = new TreeNode(root_val);
int index = idx_map[root_val];
post_idx--;
root.right = Helper(index + 1, in_right);
root.left = Helper(in_left, index - 1);
return root;
}
public TreeNode BuildTree(int[] inorder, int[] postorder) {
this.postorder = postorder;
this.inorder = inorder;
post_idx = postorder.Length - 1;
for (int idx = 0; idx < inorder.Length; idx++)
idx_map[inorder[idx]] = idx;
return Helper(0, inorder.Length - 1);
}
}
C++ решение
auto-draft, проверить перед отправкой#include <bits/stdc++.h>
using namespace std;
// Auto-generated C++ draft from the C# solution. Review containers, LINQ and helper types before submit.
class Solution {
public:
int post_idx;
vector<int>& postorder;
vector<int>& inorder;
unordered_map<int, int> idx_map = new unordered_map<int, int>();
public TreeNode Helper(int in_left, int in_right) {
if (in_left > in_right)
return null;
int root_val = postorder[post_idx];
TreeNode root = new TreeNode(root_val);
int index = idx_map[root_val];
post_idx--;
root.right = Helper(index + 1, in_right);
root.left = Helper(in_left, index - 1);
return root;
}
public TreeNode BuildTree(vector<int>& inorder, vector<int>& postorder) {
this.postorder = postorder;
this.inorder = inorder;
post_idx = postorder.size() - 1;
for (int idx = 0; idx < inorder.size(); idx++)
idx_map[inorder[idx]] = idx;
return Helper(0, inorder.size() - 1);
}
}
Java решение
сопоставлено/оригиналclass Solution {
int post_idx;
int[] postorder;
int[] inorder;
HashMap<Integer, Integer> idx_map = new HashMap<Integer, Integer>();
public TreeNode helper(int in_left, int in_right) {
if (in_left > in_right) return null;
int root_val = postorder[post_idx];
TreeNode root = new TreeNode(root_val);
int index = idx_map.get(root_val);
post_idx--;
root.right = helper(index + 1, in_right);
root.left = helper(in_left, index - 1);
return root;
}
public TreeNode buildTree(int[] inorder, int[] postorder) {
this.postorder = postorder;
this.inorder = inorder;
post_idx = postorder.length - 1;
int idx = 0;
for (Integer val : inorder) idx_map.put(val, idx++);
return helper(0, inorder.length - 1);
}
}
JavaScript решение
сопоставлено/оригиналvar buildTree = function (inorder, postorder) {
var idx_map = {};
var post_idx = postorder.length - 1;
var helper = function (in_left, in_right) {
if (in_left > in_right) return null;
var root_val = postorder[post_idx];
var root = new TreeNode(root_val);
var index = idx_map[root_val];
post_idx--;
root.right = helper(index + 1, in_right);
root.left = helper(in_left, index - 1);
return root;
};
for (var i = 0; i < inorder.length; i++) idx_map[inorder[i]] = i;
return helper(0, inorder.length - 1);
};
Python решение
сопоставлено/оригиналclass Solution:
def buildTree(self, inorder: List[int], postorder: List[int]) -> TreeNode:
def helper(in_left: int, in_right: int) -> TreeNode:
if in_left > in_right:
return None
val = postorder.pop()
root = TreeNode(val)
index = idx_map[val]
root.right = helper(index + 1, in_right)
root.left = helper(in_left, index - 1)
return root
idx_map = {val: idx for idx, val in enumerate(inorder)}
return helper(0, len(inorder) - 1)
Go решение
сопоставлено/оригиналfunc buildTree(inorder []int, postorder []int) *TreeNode {
idx_map := map[int]int{}
post_idx := len(postorder) - 1
var helper func(in_left int, in_right int) *TreeNode
helper = func(in_left int, in_right int) *TreeNode {
if in_left > in_right {
return nil
}
root_val := postorder[post_idx]
root := &TreeNode{Val: root_val}
index := idx_map[root_val]
post_idx--
root.Right = helper(index+1, in_right)
root.Left = helper(in_left, index-1)
return root
}
for i := 0; i < len(inorder); i++ {
idx_map[inorder[i]] = i
}
return helper(0, len(inorder)-1)
}
Algorithm
1️⃣
Создайте хэш-таблицу (hashmap) для хранения соответствия значений и их индексов в массиве обхода inorder.
2️⃣
Определите вспомогательную функцию
helper
, которая принимает границы левой и правой части текущего поддерева в массиве inorder. Эти границы используются для проверки, пусто ли поддерево. Если левая граница больше правой (
in_left > in_right
), то поддерево пустое и функция возвращает
None
.
3️⃣
Выберите последний элемент в массиве обхода postorder в качестве корня. Значение корня имеет индекс
index
в обходе inorder. Элементы от
in_left
до
index - 1
принадлежат левому поддереву, а элементы от
index + 1
до
in_right
— правому поддереву. Согласно логике обхода postorder, сначала рекурсивно строится правое поддерево
helper(index + 1, in_right)
, а затем левое поддерево
helper(in_left, index - 1)
. Возвращается корень.
😎
Вакансии для этой задачи
Показаны активные вакансии с пересечением по тегам задачи.