C++ 二叉搜索树代码

C++ 二叉搜索树代码

cpp 复制代码
#include <iostream>
using namespace std;

template<typename T>
struct TreeNode{
	T val;
	TreeNode *left;
	TreeNode *right;
	TreeNode():val(0), left(NULL), right(NULL){}
	TreeNode(T x):val(x), left(NULL), right(NULL){}
};

template<typename T>
class BinarySearchTree{
private:
	TreeNode<T> *root;
	
	TreeNode<T>* insertNode(TreeNode<T> *node, T value);
	TreeNode<T>* removeNode(TreeNode<T> *node, T value);
	bool searchNode(TreeNode<T> *node, T value);
	void inOrder(TreeNode<T> *node);
public:
	BinarySearchTree(): root(NULL){}
	~BinarySearchTree();
	
	void insert(T value){
		root = insertNode(root, value);
	}
	
	void remove(T value){
		root = removeNode(root, value);
	}
	
	bool search(T value){
		return searchNode(root, value);
	}
	void inOrderTraversal(){
		inOrder(root);
		cout << endl;
	}
};

template<typename T>
BinarySearchTree<T>::~BinarySearchTree(){
	while(root){
		remove(root->val);
	}
}

template<typename T>
TreeNode<T>* BinarySearchTree<T>::insertNode(TreeNode<T> *node, T value){
	if(node == NULL){
		return new TreeNode<T>(value);
	}
	if(value < node->val){
		node->left = insertNode(node->left, value);
	}else if(value > node->val){
		node->right = insertNode(node->right, value);
	}
	return node;
}

template<typename T>
TreeNode<T>* BinarySearchTree<T>::removeNode(TreeNode<T> *node, T value){
	if(node == NULL){
		return NULL;
	}
	if(value < node->val){
		node->left = removeNode(node->left, value);
	}else if(value > node->val){
		node->right = removeNode(node->right, value);
	}else{
		if(node->left == NULL && node->right == NULL){
			delete node;
			return NULL;
		}else if(node->left == NULL){
			TreeNode<T> *rightChild = node->right;
			delete node;
			return rightChild;
		}else if(node->right == NULL){
			TreeNode<T> *leftChild = node->left;
			delete node;
			return leftChild;
		}else{
			TreeNode<T> *replacement = node->right;
			while(replacement->left){
				replacement = replacement->left;
			}
			node->val = replacement->val;
			node->right = removeNode(node->right,replacement->val);
		}
	}
	return node;
}

template<typename T>
bool BinarySearchTree<T>::searchNode(TreeNode<T> *node, T value){
	if(node == NULL){
		return false;
	}
	if(value < node->val){
		return searchNode(node->left, value);
	}else if(value > node->val){
		return searchNode(node->right, value);
	}
    return true;
}

template<typename T>
void BinarySearchTree<T>::inOrder(TreeNode<T> *node){
	if(node){
		inOrder(node->left);
		cout << node->val << ',';
		inOrder(node->right);
	}
}


int main()
{
    BinarySearchTree<int> bst;
	bst.insert(50);
	bst.insert(40);
	bst.insert(60);
	bst.insert(80);
	bst.insert(90);
	bst.insert(10);
	bst.insert(20);
	bst.insert(30);
	bst.insert(70);
	bst.inOrderTraversal();
	cout << bst.search(9090) << endl;
	cout << bst.search(70) << endl;
	bst.remove(70);
	bst.inOrderTraversal();
	bst.insert(65);
	bst.inOrderTraversal();
    return 0;
}
相关推荐
FPGA信号处理3 分钟前
【 凸优化】第六讲:求解器与支持向量机
算法·机器学习·支持向量机
专注仿真5 分钟前
支持向量机(SVM)算法详解与代码实例
算法·机器学习·支持向量机
Pniubi9 分钟前
力扣42接雨水(动态规划法)
算法·leetcode·职场和发展
CQU_JIAKE25 分钟前
10.31[A]
算法·深度优先
zwc321043205528 分钟前
Day 5:threshold与inRange阈值分割
c++·图像处理·人工智能·opencv·算法·计算机视觉
云-缩影31 分钟前
实际项目中怎么选排序算法:从面试题到工程落地
java·算法·排序算法
OxYGC34 分钟前
[工程] PHP2Shell 漏洞解析:两条 PHP 内核 RCE,为什么应用层的防护全部失效
android·开发语言·php
小徐不徐说37 分钟前
数据库存储基础:理解表结构、主键、事务与 BLOB
开发语言·数据库·c++·qt·程序设计
Pniubi44 分钟前
力扣46全排列(回溯(递归))
算法·leetcode·职场和发展
草莓熊Lotso1 小时前
【C++ 基于微服务的即时通讯系统】网关基建:cpp-httplib 与 WebSocketpp 从入门到实战
linux·开发语言·数据库·c++·redis·微服务·云原生