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;
}
相关推荐
感哥3 小时前
C++ 面向对象
c++
CoovallyAIHub5 小时前
中科大DSAI Lab团队多篇论文入选ICCV 2025,推动三维视觉与泛化感知技术突破
深度学习·算法·计算机视觉
沐怡旸5 小时前
【底层机制】std::shared_ptr解决的痛点?是什么?如何实现?如何正确用?
c++·面试
NAGNIP6 小时前
Serverless 架构下的大模型框架落地实践
算法·架构
moonlifesudo6 小时前
半开区间和开区间的两个二分模版
算法
moonlifesudo6 小时前
300:最长递增子序列
算法
CoovallyAIHub11 小时前
港大&字节重磅发布DanceGRPO:突破视觉生成RLHF瓶颈,多项任务性能提升超180%!
深度学习·算法·计算机视觉
感哥11 小时前
C++ STL 常用算法
c++
CoovallyAIHub11 小时前
英伟达ViPE重磅发布!解决3D感知难题,SLAM+深度学习完美融合(附带数据集下载地址)
深度学习·算法·计算机视觉
saltymilk1 天前
C++ 模板参数推导问题小记(模板类的模板构造函数)
c++·模板元编程