#ifndef BINARYSEARCHTR_H #define BINARYSEARCHTR_H #include "stdafx.h" #include <iostream> /*节点类定义*/ class Node { public: int data; Node *parent; Node *left; Node *right; public: Node() : data(-1), parent(NULL), left(NULL), right(NULL) {}; Node(int num) : data(num), parent(NULL), left(NULL), right(NULL) {}; }; /*Binary Search Tree definition*/ class Tree { public: Tree(int num[], int len); void insertNode1(int data); void insertNode(int data); Node *searchNode(int data); void deleteNode(int data); private: void insertNode(Node *current, int data); Node *searchNode(Node *current, int data); void deleteNode(Node *current); private: Node* root; }; Tree::Tree(int num[], int len) { root = new Node(num[0]); for (int i = 1; i < len; i++) { insertNode1(num[i]); } } void Tree::insertNode1(int data) { Node *p, *par; Node *newNode = new Node(data); p = par = root; while (p != NULL) { par = p; if (data > p->data) p = p->right; else if (data < p->data) p = p->left; else if (data == p->data) { delete newNode; return; } } newNode->parent = par; if (par->data > newNode->data) par->left = newNode; else par->right = newNode; } void Tree::insertNode(int data) { if (root != NULL) { insertNode(root, data); } } void Tree::insertNode(Node* current, int data) { if (data < current->data) { if (current->left == NULL) { current->left = new Node(data); current->left->parent = current; } else insertNode(current->left, data); } else if (data > current->data){ if (current->right == NULL) { current->right = new Node(data); current->right->parent = current; } else insertNode(current->right, data); } } Node* Tree::searchNode(int data) { if (root != NULL) { return searchNode(root, data); } } Node* Tree::searchNode(Node* current, int data) { if (data < current->data) { if (current->left == NULL) return NULL; return searchNode(current->left, data); } else if (data > current->data) { if (current->right == NULL) return NULL; return searchNode(current->right, data); } return current; } void Tree::deleteNode(int data) { Node *current = NULL; current = searchNode(data); if (current != NULL) { deleteNode(current); } } void Tree::deleteNode(Node *current) { if (current->left != NULL) deleteNode(current->left); if (current->right != NULL) deleteNode(current->right); if (current->parent == NULL) { delete current; root = NULL; return; } if (current->parent->data > current->data) current->parent->left = NULL; else current->parent->right = NULL; delete current; } #endif