Recorrido de árbol (una pregunta para comprender directamente el recorrido en orden, el orden posterior, el orden de nivel y el almacenamiento de árboles)

Los temas son los siguientes:

Un árbol binario, cada nodo del árbol tiene un peso diferente.

Ahora, dado su recorrido posterior al orden y en orden, genere su recorrido de orden de nivel.

Formato de entrada

La primera línea contiene el número entero N, que representa el número de nodos en el árbol binario.

La segunda línea contiene N números enteros, que representan el recorrido posterior al orden del árbol binario.

La tercera línea contiene N números enteros, que representan el recorrido en orden del árbol binario.

Formato de salida

Genere una línea de N enteros, que representan el recorrido de orden de nivel del árbol binario.

rango de datos

1≤N≤30,
el funcionario no proporciona el rango de valores de cada peso de nodo. Por conveniencia, el rango en este sitio web es 1∼N.

Ejemplo de entrada:

7
2 3 1 5 7 6 4
1 2 3 4 5 6 7

Muestra de salida:

4 1 6 3 5 7 2

 Recorrido en orden: siga las reglas izquierda raíz derecha (1, 2, 3, 4, 5, 6, 7)

Recorrido posterior al orden: siga las reglas para las raíces izquierda y derecha (2, 3, 1, 5, 7, 6, 4)

Como dice el título, su árbol se ve así:

Se puede saber que la última posición del recorrido posterior al orden es el nodo raíz del árbol. Si encuentra la posición del nodo raíz en el recorrido en orden, puede determinar el número de nodos del subárbol izquierdo y del subárbol derecho. , es decir, 4 es el valor del nodo raíz, hay 3 nodos antes y después de él en el recorrido en orden, por lo que 1, 2, 3 son los valores de los nodos del subárbol izquierdo, 5, 6, 7 son los valores de nodo del nodo derecho y luego recurra hacia la izquierda. Repita esta operación con el subárbol y el subárbol derecho para obtener la estructura del árbol.

El código se muestra a continuación:

        

#include <iostream>
#include <vector>
#include <queue>
using namespace std;

const int N = 35;

//定义树结构
typedef struct TreeNode{
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int value) : val(value), left(nullptr), right(nullptr) {} //构造函数
}TreeNode;

//建立树结构
TreeNode* BuildTree(vector<int>& postorder, vector<int>& inorder, int postEnd, int inStart, int inEnd) {
    if(postEnd <= 0 || inStart >= inEnd)
        return nullptr;
    
    //找到根节点,并开辟空间
    int rootval = postorder[postEnd];
    TreeNode* root = new TreeNode(rootval);
    
    //找到该根节点在中序遍历中的位置
    int rootIndexInInOrder = 0;
    for(rootIndexInInOrder = inStart; rootIndexInInOrder <= inEnd; rootIndexInInOrder++){
        if(inorder[rootIndexInInOrder] == rootval){
            break;
        }
    }
    
    //计算出右子树个数
    int rightTreeSize = inEnd - rootIndexInInOrder;
    
    //递归左右子树
    root->right = BuildTree(postorder, inorder, postEnd - 1, rootIndexInInOrder + 1, inEnd);

    root->left = BuildTree(postorder, inorder, postEnd - 1 - rightTreeSize, inStart, rootIndexInInOrder - 1);
    
    return  root;
}


//树的层序遍历
vector<int> GetLevelOrderVal(TreeNode* root){
    vector<int> res;
    
    if(!root)    return res;
    
    queue<TreeNode*> q;
    q.push(root);
    
    while(!q.empty()){
        auto node = q.front();
        q.pop();
        res.push_back(node->val);
        
        if(node->left)      q.push(node->left);
        if(node->right)     q.push(node->right);
    }
    
    return res;
}

int main(){
    vector<int> postorder(N);
    vector<int> inorder(N);
    
    int n = 0;
    cin >> n;
    
    for(int i = 0; i < n; i++)      cin >> postorder[i];
    for(int i = 0; i < n; i++)      cin >> inorder[i];
    
    TreeNode* root = BuildTree(postorder, inorder, n - 1, 0, n - 1);
    
    vector<int> res = GetLevelOrderVal(root);
    
    for(auto& val : res)
        cout << val << " ";
    cout << endl;
        
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/weixin_72758935/article/details/131966947
Recomendado
Clasificación