LeetCode se refiere a la Oferta 07. Reconstruya el árbol binario


Ideas de enlace de título original :

  1. De acuerdo con el principio de recorrido de preorden y recorrido posterior, la matriz se divide y la estructura recursiva se usa para resolver el problema de construir un árbol.
  2. El primer elemento del recorrido de la reserva es el nodo raíz del árbol compuesto por la matriz, y el elemento se encuentra en el recorrido de orden medio. El lado izquierdo es el subárbol izquierdo del nodo raíz y el lado derecho es el subárbol derecho del nodo raíz.
  3. Registre el número de nodos del subárbol izquierdo en la secuencia en orden y obtenga la secuencia de preorden del subárbol izquierdo y la secuencia del subárbol derecho de acuerdo con el número en la secuencia de preorden. En la secuencia del medio, se obtienen la secuencia del medio del subárbol izquierdo y la secuencia del medio del subárbol derecho.
  4. Utilice la recursividad para estas dos partes.
  5. El límite recursivo es que el subárbol está vacío.
  6. No puede haber nodos de números duplicados en el árbol; de lo contrario, afectará la ubicación del nodo raíz.
    Resultado de división de matriz
    Dar el código:
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
    
    
public:
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
    
    
        if(preorder.empty()) return NULL;
        TreeNode * root = new TreeNode(preorder[0]);
        int i = 0;
        
        // 去找根节点在中序遍历中的位置,该位置之前的就是左子树的节点
        // 右边是右子树的节点
        while(inorder[i] != preorder[0]){
    
    
            i++;
        }
        // 分别得到左子树的前序中序遍历数组,右子树的前序中序遍历数组
        vector<int> leftPreOrder(preorder.begin()+1,preorder.begin()+1+i);
        vector<int> leftInOrder(inorder.begin(), inorder.begin()+i);
        vector<int> rightPreOrder(preorder.begin()+1+i,preorder.end());
        vector<int> rightInOrder(inorder.begin()+1+i,inorder.end());
        
        // 对左右子树递归
        root->left =  buildTree(leftPreOrder,leftInOrder);
        root->right = buildTree(rightPreOrder,rightInOrder);
        return root;
    }
};

Supongo que te gusta

Origin blog.csdn.net/qq_43078427/article/details/109705838
Recomendado
Clasificación