当前位置: 首页 > news >正文

C++ 二叉搜索树代码

C++ 二叉搜索树代码

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

相关文章:

  • Windows 远程桌面多端口访问,局域网虚拟IP映射多个Windows 主机解决方案
  • 【算法】矩阵置零
  • leetcode-数组
  • 【C++】类和对象(1)
  • 【GPT入门】第9课 思维树概念与原理
  • RocketMQ延迟消息深度解析:原理、实践与性能调优
  • 第11章 web应用程序安全(网络安全防御实战--蓝军武器库)
  • 第二章:go 注意事项(各个平台编译方式)
  • Fiddler抓取App接口-Andriod/IOS配置方法
  • JS基础之对象
  • 使用 vxe-table 导出 excel,支持带数值、货币、图片等带格式导出
  • SQL Server核心知识总结
  • STM32项目分享:智能家居语音系统(ASRPRO版)
  • 创建Electron35 + vue3 + electron-builder项目,有很过坑,记录过程
  • 基于JavaScript的PDF翻译、PDF文档解析系统开发实践,二次开发可商业化,目前包含PDF加载、放大、缩小、翻译、旋转、创建等功能
  • 前端调试中的逐过程(Step Over)、单步调试(Step Into)和单步跳出(Step Out)区别
  • Elasticsearch学习笔记
  • RHCE9.0版本笔记4:聚焦网络安全基础技术
  • spring中用到的设计模式
  • 电商项目-秒杀系统(四)秒杀异步下单防止重复秒杀
  • 简洁的网站模板/下载优化大师app
  • 做网站的工作流程/保定关键词优化软件
  • 网站宣传活动怎么做/seo搜索引擎是什么
  • web网站开发的六个步骤/厦门seo大佬
  • 公司网站建设和推广/营销型企业网站建设步骤
  • 随州网站建设哪家专业/百度一下你就知道了百度一下