Меч относится к Предложению 07. Перестроить бинарное дерево (решение проблем Java)

Меч относится к Предложению 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;
        }
    }
}

Guess you like

Origin blog.csdn.net/weixin_44201830/article/details/129683036