二叉搜索树C++版

本文介绍了一种二叉搜索树的实现方式,包括节点插入、查找及删除等基本操作,并通过示例展示了如何使用这些功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <iostream>
using namespace std;

class BTNode{
public:
	int data;
	BTNode* lChild;
	BTNode* rChild;
	BTNode(int data):data(data), lChild(nullptr), rChild(nullptr){}
};

class BSTree{
public:
	BTNode* root;
public:
	//构造空树 
	BSTree(){
		root = nullptr;
	}
	//查找结点 
	BTNode* search(int data, BTNode*& parent){
		BTNode* cur = root;
		parent = nullptr;
		while(cur){
			if(data == cur->data)
				return cur;
			else if(data > cur->data){
				parent = cur;
				cur = cur->rChild;
			}
			else{
				parent = cur;
				cur = cur->lChild;
			}	
		}
		return nullptr;
	}
	//插入结点
	void insert(int data){
		if(!root)
			root = new BTNode(data);
		else{
			BTNode* parent;
			//先查找值为data的结点,如果没有则返回空指针,再执行插入操作 
			BTNode* cur = search(data, parent);
			if(!cur){
				if(data > parent->data)
					parent->rChild = new BTNode(data);
				else
					parent->lChild = new BTNode(data);
			}  
		}
	}
	//中序遍历,二叉搜索树的中序遍历是一个有序序列 
	void inOrder(BTNode*& root){
		BTNode* cur = root;
		if(cur){
			inOrder(cur->lChild);
			cout << cur->data << endl;
			inOrder(cur->rChild);
		}
	} 
	void del(int data){
		BTNode* parent = nullptr;
		BTNode* cur = search(data, parent);
		if(cur){
			if(cur->lChild && cur->rChild){ 
				//如果要删除的结点左右孩子都存在,则找到其左孩子的最大结点替换之
				//转换成有0个或1个孩子的情况 
				BTNode* p = cur->lChild;
				BTNode* pp = cur;
				//一直往右走 
				while(p->rChild){ 
					pp = p;
					p = p->rChild;
				} 
				cur->data = p->data; 
				cur = p;//此时cur指向要删除的结点,此结点至多有一个孩子
				parent = pp;
			}
			BTNode* child = nullptr;//保存当前结点的孩子结点 
			if(cur->lChild)
				child = cur->lChild;
			else
				child = cur->rChild;
			if(cur==root)
				root = child;
			else{
				if(parent->lChild == cur)
					parent->lChild = child;
				else
					parent->rChild = child;
			} 
			delete cur;
		}
	} 
};


int main(){
	BSTree bstree;
	BTNode* cur = nullptr;
	BTNode* parent = nullptr;
	bstree.insert(30); 
	bstree.insert(5);
	bstree.insert(40);
	bstree.insert(2);
	bstree.insert(35);
	bstree.insert(80);
	bstree.insert(32);
	bstree.insert(31);
	bstree.insert(33);
	bstree.insert(60);
	bstree.insert(85);
	bstree.del(30);
	bstree.inOrder(bstree.root);
//	cur = bstree.search(30, parent);
//	if(cur){
//		cout << "找到了" << endl; 
//	}
//	else{
//		cout << "404" << endl;
//	}
	return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值