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;
}
相关推荐
地平线开发者6 分钟前
理想汽车智驾方案介绍 2|MindVLA 方案详解
算法·自动驾驶
艾莉丝努力练剑38 分钟前
【C语言16天强化训练】从基础入门到进阶:Day 7
java·c语言·学习·算法
CTRA王大大1 小时前
【golang】制作linux环境+golang的Dockerfile | 如何下载golang镜像源
linux·开发语言·docker·golang
地平线开发者1 小时前
LLM 中评价指标与训练概要介绍
算法·自动驾驶
Ghost-Face1 小时前
关于并查集
算法
zhangfeng11332 小时前
以下是基于图论的归一化切割(Normalized Cut)图像分割工具的完整实现,结合Tkinter界面设计及Python代码示
开发语言·python·图论
flashlight_hi3 小时前
LeetCode 分类刷题:2529. 正整数和负整数的最大计数
python·算法·leetcode
还梦呦3 小时前
2025年09月计算机二级Java选择题每日一练——第五期
java·开发语言·计算机二级
花火|3 小时前
算法训练营day60 图论⑩ Bellman_ford 队列优化算法、判断负权回路、单源有限最短路
算法·图论
2501_924890523 小时前
商超场景徘徊识别误报率↓79%!陌讯多模态时序融合算法落地优化
java·大数据·人工智能·深度学习·算法·目标检测·计算机视觉