Recherche d'opérandes manquants dans un arbre d'expression binaire

expression-trees java

Question

Le but du code est d’évaluer les arbres d’expression binaires (comme celui ci-dessous).

          (+)
      (*)     (2)
  (+)     (-)
 3   4   5   2

Dans l'extrait de code que j'ai, je ne sais pas if (root.getLeft() == null || root.getRight() == null) comment if (root.getLeft() == null || root.getRight() == null) recherche les opérandes manquants. S'il s'agit d'un nœud feuille (opérande), cela provoquera-t-il une exception (car la condition if sera vraie)? Je pose également la question sous forme de commentaire dans le code près de l'instruction if.

public float calculateValue(TreeNode root) {
  // Check that the root value is not null
  if (root == null) {
    throw new IllegalArgumentException("Root Node must have a value");
  }
  // If this is a leaf node, it should be a number, so return this
  if (root.getLeft() == null && root.getRight() == null) {
    try {
      return Float.parseFloat(root.getItem().toString()); 
    } catch (NumberFormatException parseError) {
      throw new NumberFormatException("Leaves must be numeric");
    }
  }
  // Validate that we have operands
  if (root.getLeft() == null || root.getRight() == null) {     
    // How does this check for missing operands? If it is a leaf node (operand),
    // will it cause an exception (as the if condition will be true)? 
    throw new IllegalArgumentException("Operator missing operands”);
  }
  // Retrieve the operands
  float leftOperand = calculateValue(root.getLeft());
  float rightOperand = calculateValue(root.getRight());
  // Extract the operator
  String operatorString = root.getItem().toString();
  if (operatorString.length() > 1) {
    throw new IllegalArgumentException("Invalid operation!");
  }
  char operator = operatorString.charAt(0);
  // Evaluate the operation

Réponse acceptée

Ci-dessous, j'ai votre code jusqu'à cette instruction if avec les commentaires supprimés:

if (root == null) {
    throw new IllegalArgumentException("Root Node must have a value");
}

if (root.getLeft() == null && root.getRight() == null) {
    try {
       return Float.parseFloat(root.getItem().toString()); 
    } catch (NumberFormatException parseError) {
       throw new NumberFormatException("Leaves must be numeric");
    }
}

if (root.getLeft() == null || root.getRight() == null) {     
    throw new IllegalArgumentException("Operator missing operands");
}

Pour répondre à votre question, notez que dans le cas d'un nœud feuille, la deuxième instruction if est vraie. Ainsi, il passera par cette tentative d’interception et n’exécutera jamais même if (root.getLeft() == null || root.getRight() == null) .



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow