Меч относится к Предложению 07. Перестроить бинарное дерево (решение проблем Java)
1. Тема
Введите результаты обхода в прямом и обратном порядке бинарного дерева, постройте бинарное дерево и верните его корневой узел.
Предположим, что ни входной обход в прямом порядке, ни результаты обхода в порядке не содержат повторяющихся чисел.
Пример 1:
Ввод: предварительный порядок = [3,9,20,15,7], порядок = [9,3,15,20,7]
Вывод: [3,9,20,null,null,15,7]
示例 2:
Ввод: предзаказ = [-1], порядок = [-1]
Вывод: [-1]
лимит:
0 <= количество узлов <= 5000
Автор: Krahets
Ссылка: https://leetcode.cn/leetbook/read/illustration-of-algorithm/99lxci/
Источник: LeetCode
Авторские права принадлежат автору. Для коммерческой перепечатки просьба обращаться к автору за авторизацией, для некоммерческой перепечатки просьба указывать источник.
2. Идеи решения проблем
личные мысли
Каждый раз, когда узел 0 обхода в прямом порядке ищется как root
узел, положение узла находится в обходе в прямом порядке , а массив обхода в прямом порядке делится на два левых и правых подмассива root
в соответствии с нижним индексом позиции. массив, в соответствии с левым и правым подмассивами. Группы дерева одинаковой длины также группируются и разделяются, а затем рекурсивно вызывается функция для обработки левого и правого поддеревьев.i
[0,i-1]
[i+1,len-1]
3. Краткое описание функции типа данных
//数组
int[] array_name=new int[len];//数组定义
int len=array_name.length;//获得数组长度
4. Java-код
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode buildTree(int[] preorder, int[] inorder) {
if(preorder.length==0&&inorder.length==0){
//特殊情况,也是递归的边界条件
return null;
}
else{
//构造根节点
int root_val=preorder[0];//前序遍历的首元素为根节点的值
TreeNode root=new TreeNode(root_val);//创建根节点
//在中序遍历数组中查找根节点位置
int find_root=0;
int i=0;
for(i=0;i<inorder.length&&find_root==0;i++){
if(inorder[i]==root_val){
find_root=1;
}
}//此时得到下标i+1,[0,i-1][i][i+1,len-1]
//数组二分
i--;
int[] left_inorder=new int[i];
int[] right_inorder=new int[inorder.length-i-1];
int[] left_preorder=new int[i];
int[] right_preorder=new int[inorder.length-i-1];
for(int j=0;j<i;j++){
left_inorder[j]=inorder[j];
left_preorder[j]=preorder[j+1];
}
for(int j=i+1;j<inorder.length;j++){
right_inorder[j-i-1]=inorder[j];
right_preorder[j-i-1]=preorder[j];
}
//递归调用
root.left= buildTree(left_preorder, left_inorder);
root.right= buildTree(right_preorder, right_inorder);
return root;
}
}
}