Ideas de enlace de título original :
- 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.
- 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.
- 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.
- Utilice la recursividad para estas dos partes.
- El límite recursivo es que el subárbol está vacío.
- No puede haber nodos de números duplicados en el árbol; de lo contrario, afectará la ubicación del nodo raíz.
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;
}
};