1130 Infix Expression (25 puntos) -PAT Grado A prueba real

1130 Expresión de infijo (25 分)

Dado un árbol de sintaxis (binario), se supone que debe generar la expresión infijo correspondiente, con paréntesis que reflejan las precedencias de los operadores.

Especificación de entrada:
cada archivo de entrada contiene un caso de prueba. Para cada caso, la primera línea da un número entero positivo N (≤ 20) que es el número total de nodos en el árbol de sintaxis. Luego siguen N líneas, cada una da la información de un nodo (la i-ésima línea corresponde al i-ésimo nodo) en el formato:

datos left_child right_child

donde los datos son una cadena de no más de 10 caracteres, left_child y right_child son los índices de los hijos izquierdo y derecho de este nodo, respectivamente. Los nodos están indexados de 1 a N. El enlace NULL está representado por −1. Las figuras 1 y 2 corresponden a las muestras 1 y 2, respectivamente.

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

Especificación de salida:
Para cada caso, imprima en una línea la expresión infija, con paréntesis que reflejen las precedencias de los operadores. Tenga en cuenta que no debe haber paréntesis adicionales para la expresión final, como se muestra en las muestras. No debe haber espacio entre ningún símbolo.

Entrada de muestra 1:
8
* 8 7
a -1 -1
* 4 1
+ 2 5
b -1 -1
d -1 -1
- -1 6
c -1 -1
Salida de muestra 1:
(a + b) (c ( -d))
Entrada de muestra 2:
8
2,35 -1 -1
* 6 1
- -1 4
% 7 8
+ 2 3
a -1 -1
str -1 -1
871-1-1
Salida de muestra 2:
(a * 2,35 ) + (- (str% 871))

La idea principal del tema:
dado un árbol binario, se requiere generar su expresión infija y agregar paréntesis cuando sea apropiado para indicar la prioridad

Análisis de algoritmos:
utilice la estructura para almacenar la información relevante del nodo, incluidos los datos, leftChild y rightChild. Recorra todos los nodos secundarios, busque el número que no aparece entre ellos y márquelo como raíz. Utilice la búsqueda en profundidad para completar el recorrido de orden medio del árbol.
La dificultad radica en cómo generar los paréntesis. De hecho, todos los nodos de símbolo de nodos no raíz (en referencia a los nodos donde el subárbol derecho no está vacío, porque no hay subárbol izquierdo y el subárbol derecho no existe, porque esto se expresa en aritmética La fórmula no es válida.) Debe haber paréntesis en los lados izquierdo y derecho, y las cadenas en los lados izquierdo y derecho deben expandirse. Captamos este punto y sacamos "(" primero cuando encontramos un nodo de símbolo de un nodo no raíz, y luego emitimos ")" después de atravesar sus subárboles izquierdo y derecho

Código AC:

#include<bits/stdc++.h>
using namespace std;
struct node{
    
    
  string data;
  int leftChild, rightChild;
};
int nodeNum,root;
node nodeSet[25];
/*只要是非根结点的符号结点一定有括号,利用这个特点可以将大问题化简*/
void DFS(int index){
    
    
   if(index!=root&&(nodeSet[index].rightChild!=-1))
  //右子树不空就代表它是一个符号结点,因为不存在只有左边没有右边的情况
    printf("(");
/*遇到非根结点的符号结点,先输出(,遍历完其左右子树后再输出)*/
  if(nodeSet[index].leftChild!=-1)
    DFS(nodeSet[index].leftChild);
  cout << nodeSet[index].data;
  if(nodeSet[index].rightChild!=-1)
    DFS(nodeSet[index].rightChild);
  if(index!=root&&(nodeSet[index].rightChild!=-1))
    printf(")");
}
int main(){
    
    
  cin >> nodeNum;
  int temp[nodeNum+1] = {
    
    0};
  for (int i = 1; i <= nodeNum;i++){
    
    
    cin >> nodeSet[i].data >> nodeSet[i].leftChild >> nodeSet[i].rightChild;
    temp[nodeSet[i].leftChild] = i;
    temp[nodeSet[i].rightChild] = i;
  }
  for (int i = 1; i <= nodeNum;i++){
    
    
    if(temp[i]==0){
    
    
      root = i;
      break;
    }
  }//找到孩子结点中没有出现过的编号,该编号为root
  DFS(root);
}

Supongo que te gusta

Origin blog.csdn.net/weixin_48954087/article/details/113867001
Recomendado
Clasificación