// добавляет нули вместо пустой строки в дереве разбора private void setZero(BinaryTree tree) { if (tree.getLeft() != null) setZero(tree.getLeft()); if (tree.getRight() != null) setZero(tree.getRight()); if (tree.getData().Equals("")) tree.setData("0"); }
// добавление к дереву триг функции private void parseTrigFunction(BinaryTree tree, int pos) { String tmp = tree.getData(); BinaryTree left = new BinaryTree(); tree.setData(tmp.Substring(pos, 3)); // триг функцию добавляем в вершину left.setData(tmp.Substring(pos + 3)); // а аргумент в левого потомка tree.addLeftChild(left); parse(tree.getLeft()); // парсим левого потомка }
// добавление потомков и последующий парсинг левого и правого потомков private void parseNext(BinaryTree tree, String sign, int pos) { addChilds(tree, sign, pos); parse(tree.getLeft()); parse(tree.getRight()); }
// поиск мат знака private void findMathSign(BinaryTree tree, String sign) { int pos = 0; if (tree != null) { if (tree.getLeft() == null && tree.getRight() == null) { if (sign.Equals("-") && CountMinus > 1) // если - и их больше 1 { pos = tree.getData().LastIndexOf(sign); CountMinus--; } else pos = tree.getData().IndexOf(sign); if (pos != -1 && !isVariable(tree.getData()) && !isDigit(tree.getData())) parseNext(tree, sign, pos); } else if (tree.getLeft() != null && tree.getRight() != null) { findMathSign(tree.getLeft(), sign); findMathSign(tree.getRight(), sign); } else throw new Exception("Ошибка при построении дерева!"); } }
// подсчет кол-ва переменных в дереве private void getCountVariables(BinaryTree tree) { if (tree.getLeft() != null) getCountVariables(tree.getLeft()); if (tree.getRight() != null) getCountVariables(tree.getRight()); if (isVariable(tree.getData()) && !isMathFunction(tree.getData())) { for (int i = 0; i < var.Count; i++) { if (var[i].Equals(tree.getData())) // если такая переменная уже была посчитана { return; } } var.Add(tree.getData()); // иначе добавляем ее } }
// вычисление дерева private double calculateTree(BinaryTree tree, List<double> args) { double left = 0, right = 0, res = 0; if (tree.getData().Equals("+")) { left = calculate(tree.getLeft(), args); // считаем левую часть right = calculate(tree.getRight(), args); // считаем правую часть res = left + right; } else if (tree.getData().Equals("-")) { left = calculate(tree.getLeft(), args); // считаем левую часть right = calculate(tree.getRight(), args); // считаем правую часть res = left - right; } else if (tree.getData().Equals("*")) { left = calculate(tree.getLeft(), args); // считаем левую часть right = calculate(tree.getRight(), args); // считаем правую часть res = left * right; } else if (tree.getData().Equals("/")) { left = calculate(tree.getLeft(), args); // считаем левую часть right = calculate(tree.getRight(), args); // считаем правую часть res = left / right; } else if (tree.getData().Equals("^")) { left = calculate(tree.getLeft(), args); // считаем левую часть right = calculate(tree.getRight(), args); // считаем правую часть res = Math.Pow(left, right); } else if (tree.getData().Equals("cos")) { left = calculate(tree.getLeft(), args); // считаем левую часть res = Math.Cos(left); } else if (tree.getData().Equals("sin")) { left = calculate(tree.getLeft(), args); // считаем левую часть res = Math.Sin(left); } else if (tree.getData().Equals("exp")) { left = calculate(tree.getLeft(), args); // считаем левую часть res = Math.Exp(left); } else if (tree.getData().Equals("log")) { left = calculate(tree.getLeft(), args); // считаем левую часть res = Math.Log(left); } return res; }