[Árbol] B016_ verificar árbol binario (disjuntos-set | BFS / DFS)

Uno, Título Descripción

二叉树上有 n 个节点,按从 0 到 n - 1 编号,其中节点 i 的两个子节点分别是 leftChild[i] 和 rightChild[i]。

只有 所有 节点能够形成且 只 形成 一颗 有效的二叉树时,返回 true;否则返回 false。

如果节点 i 没有左子节点,那么 leftChild[i] 就等于 -1。右子节点也符合该规则。

注意:节点没有值,本问题中仅仅使用节点编号。

, La solución segundo problema

Método a disjuntos-set

naturaleza binaria:

  • El nodo raíz es 0
  • Otros nodos de la constante es 1.

De acuerdo con las propiedades anteriores, podemos escribir el siguiente código, * pero es unilateral respuesta. 0 no es necesariamente el nodo raíz.

public boolean validateBinaryTreeNodes(int n, int[] leftChild, int[] rightChild) {
  int[] inDegree = new int[n];
  for (int i = 0; i < n; i++) {
    if (leftChild[i] >= 0)
        inDegree[leftChild[i]]++;
     if (rightChild[i] >= 0)
        inDegree[rightChild[i]]++;
  }

  if (inDegree[0] != 0)
      return false;
  
  for (int i = 1; i < n; i++)
    if (inDegree[i] != 1)
      return false;
  return true;
}

* Nos lógica del código que diga lo siguiente: el grado del nodo debe ser un 0, el nodo es mayor que 1 no existe.

public boolean validateBinaryTreeNodes(int n, int[] leftChild, int[] rightChild) {
  int[] inDegree = new int[n];
  for (int i = 0; i < n; i++) {
    if (leftChild[i] != -1)
        inDegree[leftChild[i]]++;
     if (rightChild[i] != -1)
        inDegree[rightChild[i]]++;
  }
  int in0 = 0;
  int inOther = 0;
  for (int i : inDegree) {
      if (i == 0) in0++;
      if (i >= 2) inOther++;
  }
  return in0 == 1 && inOther == 0;
}

Aquí es un punto alto: * Si la satisface árbol La presencia de un anillo del grado de un nodo 0 solamente, y la ausencia de nodos es mayor que 1.

Por lo tanto, el grado de ejecución del nodo de estadísticas simples no tiene sentido, tenemos que juzgar anillo. Así que aquí únicamente con disjuntos-set para hacer.

La lógica de la base es doble:

  • Dos nodos no se están comunicando, donde el padre del nodo hijo puede poseer al primero.
  • Cualquiera de los dos nodos se desconecta, es decir, el anillo no está presente.
public boolean validateBinaryTreeNodes(int n, int[] leftChild, int[] rightChild) {
  UF uf = new UF(n);
  for (int i = 0; i < n; i++) {
    if (leftChild[i] != -1) {
      if (uf.find(leftChild[i]) != leftChild[i] || uf.isConn(leftChild[i], i))
          return false;
      uf.union(i, leftChild[i]);
    }
    if (rightChild[i] != -1) {
      if (uf.find(rightChild[i]) != rightChild[i] || uf.isConn(rightChild[i], i))
          return false;
      uf.union(i, rightChild[i]);
    }
  }
  return uf.count == 1;
}
class UF {
	int[] parent;
	int[] size;
    int count;
    public UF(int N) {
	    count = N;
	    parent = new int[N];
	    size = new int[N];
	    for(int i = 0; i < N; i++) {
		    parent[i] = i;
		    size[i] = 1;
	    }
	}
    public boolean isConn(int p, int q) {
        return find(p) == find(q);
    }
	public int find(int p) {
	    while (p != parent[p]) {
	        p = parent[p];
	    }
	    return p;
	}
	public void union(int p, int q) {
	    int pRootID = find(p);
	    int qRootID = find(q);
	
	    if(pRootID == qRootID)  return;
	
	    if(size[pRootID] > size[qRootID]) {
	        parent[qRootID] = pRootID;
	        size[pRootID] += size[qRootID];
	    }else {
	        parent[pRootID] = qRootID;
	        size[qRootID] += size[pRootID];
	    }
	    count--;  // 连通分量减一
	}
}

Análisis de la complejidad

  • Complejidad de tiempo: la ( ) El () ,
  • Espacio de la complejidad: la ( ) El () ,

Método dos: DFS o BFS anillo juicio


Análisis de la complejidad

  • Complejidad de tiempo: la ( ) El () ,
  • Espacio de la complejidad: la ( ) El () ,
Publicados 495 artículos originales · ganado elogios 105 · Vistas a 30000 +

Supongo que te gusta

Origin blog.csdn.net/qq_43539599/article/details/104867560
Recomendado
Clasificación