#include "Tree.h"

Node* CreateNode(NodeType type, int value, Node *left, Node *right)
{
	Node *node = (Node*)malloc(sizeof(Node));
	node->type = type;
	node->value = value;
	node->left = left;
	node->right= right;
	
	return node;
}

Node* ValueNode(NodeType type, int value)
{
	return CreateNode(type, value, NULL, NULL);
}

Node* SimpleNode(NodeType type)
{
	return ValueNode(type, 0);
}

int Calculate(Tree tree, int *values)
{
	int tmp;
	
	if (tree == NULL) return 0;
	
	switch (tree->type)
	{
		case nt_number: return tree->value;
		case nt_var: return values[tree->value];
		case nt_operation:
		{
			switch (tree->value)
			{
				case OPERATION_PLUS: return Calculate(tree->left, values) + Calculate(tree->right, values);
				case OPERATION_MINUS: return Calculate(tree->left, values) - Calculate(tree->right, values);
				case OPERATION_MUL: return Calculate(tree->left, values) * Calculate(tree->right, values);
				case OPERATION_DIV: return Calculate(tree->left, values) / Calculate(tree->right, values);
				case OPERATION_INC:
				{
					tmp = ++values[tree->left->value];
					return tmp;
				}
			}
		}
	}
}
