#pragma once
#include<iostream>
using namespace std;
class Tree {
private:
struct Node {
int data;
Node* left;
Node* right;
Node(int value=0):data(value),left(nullptr),right(nullptr){}
};
Node* root;
void insert(int key, Node*& o);//插入指定关键字
void remove(int key, Node*& o);//删除指定关键字
void pre_for_each(Node*)const;//前序
void mid_for_each(Node*)const;//中序
void lst_for_each(Node*)const;//后序
Node* find_max(Node*)const;
Node* find_min(Node*)const;
public:/*下面的函数都是用户接口*/
Tree():root(NULL){}
void insert(int key) { insert(key,root); }
void remove(int key) { remove(key, root);}
bool isEmpty()const;
void pre_for_each()const { pre_for_each(root); }
void mid_for_each()const;
void lst_for_each()const;
Node* find_max()const { return find_max(root); }
Node* find_min()const { return find_min(root); }
};
void Tree::insert(int key, Node*& o) {
if (o == nullptr) {
o = new Node(key);//由于是对指针引用进行操作,所以new一个key的节点就完成插入了
}
else if (key < o->data) {//关键字小于当前节点的关键字,则递归的插入到左边
insert(key, o->left);
}
else if (key > o->data) {//大于则插入到右边
insert(key, o->right);
}
}
void Tree::remove(int key, Node*& o) {
if (o == nullptr) {
return;
}
else if (key < o->data) {//关键字小于,把删除工作交给左边的完成
remove(key, o->left);
}
else if (key > o->data) {//大于,则交给右边
remove(key, o->right);
}//节点是有2个儿子的情况,找到该节点右子树中的最小元,
//然后修改当前节点值为那个最小元的值,再把那个最小元删除
else if (o->left && o->right) {
o->data = find_min(o->right)->data;
remove(o->data, o->right);
}
//一个儿子或者无子的情况,让当前节点指针指向其中一个(非空)儿子,
//爷爷的右儿子或者左儿子的指针指向当前节点的左右儿子
//如果无子(都是nullptr),那么也没关系
else {
Node* tmp = o;
o = (o->left) ? o->left : o->right;
delete tmp;
}
}
bool Tree::isEmpty()const {
return root == nullptr;
}
Tree::Node* Tree::find_max(Node* o) const{
if (o == nullptr) {
return nullptr;
}while (o->right != nullptr) {
o = o->right;
}
return o;
}
Tree::Node* Tree::find_min(Node* o)const {
if (o == nullptr) {
return nullptr;
}if (o->left != nullptr) {
return find_min(o->left);
}
return o;
}
void Tree::pre_for_each(Node* o)const {
if (o != nullptr) {
pre_for_each(o->left);
std::cout << o->data << endl;
pre_for_each(o->right);
}
}
运行程序
#include <iostream>
#include "BinaryTree.h"
int main()
{
Tree t;
t.insert(11);
t.insert(22);
t.insert(1);
t.insert(1231);
t.insert(2);
t.pre_for_each();
cout << "最大:"<<t.find_max()->data;
cout << "\n最小:"<<t.find_min()->data;
}
运行结果