Edición de la Universidad de Zhejiang "Estructura de datos (segunda edición)" Recopilación de preguntas-Ejercicio 4.5

Ejercicio 4.5 El problema de ancestro común más cercano de un árbol binario almacenado secuencialmente (25 punto (s))

Suponiendo que hay dos nodos numerados i y j en el árbol binario almacenados secuencialmente, diseñe un algoritmo para encontrar el número y valor de su nodo ancestro común más cercano.

Ejemplo:

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

#define CHECK(x) if(H[x]==0) {printf("ERROR: T[%d] is NULL\n", x);return 0;}
#define MARK(x)  {int h=x;while(h){V[h]+=1;h>>=1;}}

int main()
{
    int N;
    cin >> N;
    vector<int> H;
    vector<int> V;
    H.reserve(N+1);
    V.reserve(N+1);
    for(int k = 1; k <= N; k++) {
        cin >> H[k];
        V[k] = 0;
    }
    int i, j;
    cin >> i >> j;
    CHECK(i);
    CHECK(j);
    MARK(i);
    MARK(j)
    while(i) {
        if(V[i] == 2) { cout << i << ' ' << H[i] << endl; break;}
        i >>= 1;
    }
    return 0;
}

Ideas:

Marque la ruta desde i, j hasta el nodo raíz, y luego vuelva a verificar la ruta desde i o j. Si un nodo se marca dos veces, entonces este es el ancestro común

Supongo que te gusta

Origin blog.csdn.net/u012571715/article/details/113308211
Recomendado
Clasificación