#include #include "tree.h" int TreeNode::height(const TreeNode* t) { // static method if (t == 0) return 0; int h1 = height(t->left); int h2 = height(t->right); if (h1 >= h2) return h1 + 1; else return h2 + 1; } void TreeNode::release(TreeNode* t) { // Delete tree, static method if (t == 0) return; if (t->left != 0) { release(t->left); t->left = 0; } if (t->right != 0) { release(t->right); t->right = 0; } delete t; } void TreeNode::printSubtree(int level) const { int i; // Skip space for indent for (i = 0; i < level; ++i) printf(" "); // 4 spaces switch (nodeType) { case node_type_undefined: printf("undefined"); break; case int_const: printf("int_const"); printf(" value=%d", intValue); break; case double_const: printf("double_const"); printf(" value=%lf", doubleValue); break; case string_const: printf("string_const"); printf(" value=%s", stringValue.c_str()); break; case name: printf("name"); printf(" value=%s", stringValue.c_str()); break; case name_ref: printf("name_ref"); printf(" value=%s", stringValue.c_str()); break; case list: printf("list"); break; case array_element: printf("array_element"); break; case function_call: printf("function_call"); printf(" name=%s", stringValue.c_str()); break; case empty_array: printf("empty_array"); break; case array_append: printf("array_append"); break; case assign: printf("assign"); break; case typecast: printf("assign"); break; case plus: printf("plus"); break; case minus: printf("minus"); break; case uminus: printf("uminus"); break; case mul: printf("mul"); break; case div: printf("div"); break; case mod: printf("mod"); break; case lor: printf("lor"); break; case land: printf("land"); break; case lnot: printf("lnot"); break; case relop: printf("relop: "); switch (intValue) { case RELOP_EQ: printf("=="); break; case RELOP_NE: printf("!="); break; case RELOP_GT: printf(">"); break; case RELOP_GE: printf(">="); break; case RELOP_LT: printf("<"); break; case RELOP_LE: printf("<="); break; default: printf("Illegal"); break; } break; default: printf("unknown_node_type"); } printf("\n"); if (left != 0) left->printSubtree(level+1); if (right != 0) right->printSubtree(level+1); } void Tree::print() const { if (root() != 0) root()->printSubtree(0); }