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