Descripción del problema
Se le proporciona una matriz para el recorrido en orden previo y una matriz para el recorrido en orden, respectivamente, y debe construir el árbol binario. Suponga que ni el recorrido en orden previo de entrada ni los resultados del recorrido en orden contienen números duplicados. Por ejemplo, ingrese la secuencia transversal en orden previo {1,2,4,7,3,5,6,8} y la secuencia transversal en orden {4,7,2,1,5,3,8,6}, luego reconstruya el árbol binario y volver.
análisis del problema
El orden transversal del árbol binario:
orden previo: raíz izquierda y derecha
orden medio: raíz izquierda derecha
orden posterior: raíz izquierda y derecha
El nodo raíz correspondiente se puede conocer a partir de la secuencia transversal en preorden, y la posición del nodo raíz en la secuencia transversal en orden separa el subárbol izquierdo y el subárbol derecho.
Luego, construya recursivamente un árbol binario en el subárbol izquierdo y en el subárbol derecho a su vez.
Código
/**
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
*
* public TreeNode(int val) {
* this.val = val;
* }
* }
*/
package treeAlgorithm;
import java.util.Arrays;
public class ReConstructBinaryTree {
public static void main(String[] args) {
int[] pre = {
1,2,4,7,3,5,6,8};
int[] in = {
4,7,2,1,5,3,6,8};
TreeNode treeNode = reConstructBinaryTree(pre, in);
prePost(treeNode);
}
/**
*
* @param pre 先序遍历序列
* @param in 中序遍历序列
* @return
*/
public static TreeNode reConstructBinaryTree(int [] pre,int [] in) {
if(pre.length == 0 || in.length == 0)
return null;
TreeNode root = new TreeNode(pre[0]);
for (int i = 0; i < in.length; i++) {
if(in[i] == pre[0]){
//左子树,copyOfRange函数是左闭右开
root.left = reConstructBinaryTree(Arrays.copyOfRange(pre,1,i+1),Arrays.copyOfRange(in,0,i));
//递归构建左子树
root.right = reConstructBinaryTree(Arrays.copyOfRange(pre,i+1,pre.length),Arrays.copyOfRange(in,i+1,in.length));
break;
}
}
return root;
}
/**
* 对构建的树进行先序遍历,验证结果
* @param root
*/
public static void prePost(TreeNode root){
if(root == null)
System.out.println("空树");
System.out.println(root.val);
if(root.left != null)
prePost(root.left);
if(root.right!= null)
prePost(root.right);
}
}
resumen
Este tipo de pregunta de algoritmo examina principalmente la estructura y las características del árbol binario. Es necesario dominar las tres reglas transversales del árbol binario con soltura. Al mismo tiempo, es necesario comprender que la definición del árbol es recursiva, por lo que la recursividad se utiliza para resolver este tipo de problema.