一,首先建立节点
#ifndef __NODE__
#define __NODE__
template<typename T>
struct Node {
Node<T>() {
left = 0;
right = 0;
value = 0;
}
Node<T>(T value) {
left = 0;
right = 0;
this ->value = value;
}
T value;
Node<T> *left;
Node<T> *right;
};
#endif
然后再实现其排序二叉树,其源代码如下:
#include "Node.h"
#include <iostream>
using namespace std;
template<typename T>
class SortBiTree {
public:
SortBiTree();
SortBiTree(Node<T> *root);
~SortBiTree();
int GetSize() const { return size; }
Node<T> *GetRoot() const { return root; }
bool Insert(T value, Node<T> *cur);
bool Delete(T value, Node<T> *cur);
void MidOrder(Node<T> *cur);//中序遍历
void PreOrder(Node<T> *cur);//前序遍历
void Clear(Node<T> *root);
Node<T> *Search(T value);
int GetHeight();
private:
void Print(Node<T> *nd);
int GetHeight(Node<T> *cur);
private:
Node<T> *root;
int size;
int height;
};
template<typename T> SortBiTree<T>::SortBiTree() {
this ->size = 0;
this ->height = 0;
this ->root = NULL;
}
template<typename T> SortBiTree<T>::SortBiTree(Node<T> *root) {
SortBiTree();
this ->root = root;
this ->size++;
}
template<typename T> SortBiTree<T>::~SortBiTree() {
if(root != NULL)
Clear(root);
}
template<typename T> void SortBiTree<T>::Clear(Node<T> *root) {
if(root != NULL) {
Clear(root ->left);
Clear(root ->right);
delete root;
root = NULL;
}
}
template<typename T> Node<T> *SortBiTree<T>::Search(T value) {
Node<T> *cur = root;
while(cur != NULL) {
if(cur ->value > value)
cur = cur ->left;
else if(cur ->value < value)
cur = cur ->right;
else
return cur;
}
return NULL;
}
template<typename T> int SortBiTree<T>::GetHeight() {
height = GetHeight(root);
return height;
}
template<typename T> int SortBiTree<T>::GetHeight(Node<T> *cur) {
int lh, rh;
if(cur != NULL) {
lh = GetHeight(cur ->left);
rh = GetHeight(cur ->right);
return lh > rh ? lh + 1 : rh + 1;
}
else {
return 0;
}
}
//以下使用递归的方式
template<typename T> bool SortBiTree<T>::Insert(T value, Node<T> *cur) {
if(root == NULL) {
root = new Node<T>(value);
root ->left = NULL;
root ->right = NULL;
size++;
return true;
}
if(cur != NULL) {
if(cur->value == value) {
cout << "已经存在此元素" << endl;
return false;
}
else if(cur ->value < value && cur ->right != NULL)
return Insert(value, cur ->right);
else if(cur ->value > value && cur ->left != NULL)
return Insert(value, cur ->left);
Node<T> *newNode = new Node<T>(value);
if(cur ->value > value) {
cur ->left = newNode;
}
else {
cur ->right = newNode;
}
size++;
}
return true;
}
template<typename T> bool SortBiTree<T>::Delete(T value, Node<T> *cur) {
if(root != NULL && root ->value == value) {
Node<T> *p = cur ->right, *pre = cur;
while(p ->left != NULL) {
pre = p;
p = p ->left;
}
pre ->left = p ->right;
p ->left = cur ->left;
p ->right = cur ->right;
this ->root = p;
delete cur;
size--;
return true;
}
if(cur != NULL) {
Node<T> *c = NULL;
Node<T> *parent = cur;
if(cur ->value > value) {
if(cur ->left != NULL && cur ->left ->value != value) {
Delete(value, cur ->left);
}
else if(cur ->left != NULL && cur ->left ->value == value) {
c = cur ->left;
}
}
else if(cur ->value < value) {
if(cur ->right != NULL && cur ->right ->value != value) {
Delete(value, cur ->right);
}
else if(cur ->right != NULL && cur ->right ->value == value) {
c = cur ->right;
}
}
if(c != NULL) {
if(c ->left == NULL && c ->right == NULL) {
c == parent ->right ? parent ->right = NULL : parent ->left = NULL;
delete c;
c = NULL;
}
else if(c ->left != NULL && c ->right == NULL) {
Node<T> *p = c;
c == parent ->right ? parent ->right = c ->left : parent ->left = c ->left;
delete p;
}
else if(c ->left == NULL && c ->right != NULL) {
Node<T> *p = c;
c == parent ->right ? parent ->right = c ->left : parent ->left = c ->left;
delete p;
}
else {
Node<T> *p = c ->right, *temp;
Node<T> *pre = p;
while(p ->left != NULL) {
pre = p;
p = p ->left;
}
pre ->left = p ->right;
p ->left = c ->left;
if(c ->right != p)
p ->right = c ->right;
if(parent ->right == c) {
parent ->right = p;
}
else {
parent ->left = p;
}
delete c;
}
size --;
return true;
}
else {
cout << "找不到此元素" << endl;
return false;
}
}
return false;
}
template<typename T> void SortBiTree<T>::Print(Node<T> *nd) {
cout << nd->value << " ";
}
template<typename T> void SortBiTree<T>::MidOrder(Node<T> *cur) {
if(cur != NULL) {
MidOrder(cur ->left);
Print(cur);
MidOrder(cur ->right);
}
}
template<typename T> void SortBiTree<T>::PreOrder(Node<T> *cur) {
if(cur != NULL) {
Print(cur);
PreOrder(cur ->left);
PreOrder(cur ->right);
}
}