二叉搜索树的增删改查

#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->right : 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;
}

运行结果
在这里插入图片描述

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_46028606/article/details/107728008