La recherche en profondeur Leetcode parcourt la séquence pour construire un arbre binaire à partir du java du milieu et du post-ordre

Description du titre
Construisez un arbre binaire basé sur le parcours d'ordre intermédiaire et le parcours post-ordre d'un arbre.
Remarque: vous pouvez supposer qu'il n'y a pas d'éléments en double dans l'arborescence.
Par exemple, avec
pré - commande afinde = [9,3,15,20,7]
Séquence après postorder = traversal [9,15,7,20,3]
retourne l'arbre binaire suivant:
3
/
920
/
157

Solution: Il est
Insérez la description de l'image ici
similaire à la séquence traversal pré-commande connu précédemment et en ordre séquence traversal, sauf que le nœud racine est déterminé ici par le dernier noeud de la séquence traversal post-commande.
InLeft représente l'indice de départ de l'in- séquence d'ordre de traversée, Inright Indique l'indice d'extrémité de la séquence de parcours moyen ordre, post_Left est utilisé pour indiquer l'indice de début de la séquence de traversée de post-commande, et post_Right représente l'indice d'extrémité de la séquence de post-commande traversal. Dans le
poste -order traversal, le dernier nœud est la racine du nœud racine. Les valeurs et indices du nœud traversé sont stockés dans une carte, et la position i_Index du nœud racine se trouve dans la carte, puis le sous-arbre gauche correspondant (inLeft—— iIndex-1) et le sous-arbre droit (i_Index + 1) peuvent être déterminés. inRight), puis la longueur du sous-arbre gauche peut être obtenue sous la forme (i_index-inLeft). Une fois la longueur du sous-arbre gauche obtenue, la limite entre le sous-arbre gauche et le sous-arbre droit peuvent être obtenus en outre dans la séquence de traversée post-ordre. Comme indiqué ci-dessous:
Insérez la description de l'image ici
Code:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    
    
    private Map<Integer,Integer> indexmap = new HashMap<>();
    public TreeNode buildTree(int[] inorder, int[] postorder) {
    
    
        int n = inorder.length;
        for(int i = 0;i<n;i++){
    
    
            indexmap.put(inorder[i],i);
        }
        return mybuildTree(inorder,postorder,0,n-1,0,n-1);

    }
    public TreeNode mybuildTree(int[] inorder,int[] postorder,int in_left,int in_right,int post_left,int post_right){
    
    
        if(in_left > in_right || post_left > post_right){
    
    
            return null;
        }
        int post_root = post_right;
        int i_index = indexmap.get(postorder[post_root]);
        TreeNode root = new TreeNode(postorder[post_root]);
        int leftsize = i_index - in_left;
        root.left = mybuildTree(inorder,postorder,in_left,i_index-1,post_left,post_left+leftsize-1);
        root.right = mybuildTree(inorder,postorder,i_index+1,in_right,post_left+leftsize,post_right-1);
        return root;

    }
}

Je suppose que tu aimes

Origine blog.csdn.net/stonney/article/details/110938657
conseillé
Classement