二叉树代码区

#pragma once
#include<iostream>

using namespace std;
template<class T>
struct BTreeNode
{
	BTreeNode(const T& data=T()):_data(data)
	{}
	BTreeNode<T>* left = nullptr;
	BTreeNode<T>* right = nullptr;
	T _data;
};

template<class T>
class BTree
{
	typedef BTreeNode<T> Bnode;
	typedef Bnode* pnode;
public:
	BTree()
	{
		_root = nullptr;
	}
	~BTree()
	{}
	pnode Find(const T& data)
	{
		if (_root == nullptr)
			return nullptr;
		pnode pcur = _root;
		while (pcur)
		{
			if (pcur->_data == data)
			{
				return pcur;
			}
			if (pcur->_data > data)
				pcur = pcur->left;
			if (pcur->_data < data)
				pcur = pcur->right;
			if (pcur->_data == data)
				 return pcur;
		}
		return nullptr;
	}
	bool Insert(const T& data)
	{
		if (_root == nullptr)
		{
			_root = new Bnode(data);
			return true;
		}
		pnode pcur = _root;
		pnode parent = nullptr;//记录双亲
		while (pcur)
		{
			parent = pcur;
			if (pcur->_data < data)
			{
				pcur = pcur->right;
			}
			else if (pcur->_data > data)
			{
				pcur = pcur->left;
			}
			else
			{
				return false;
			}
		}
		pcur = new Bnode(data);
		if (data < parent->_data)
		{
			parent->left = pcur;
		}
		if (data > parent->_data)
		{
			parent->right = pcur;
		}
		return true;
	}
	bool Erase(const T& data)
	{
		if (_root == nullptr)
			return false;
		pnode pcur = _root;
		pnode parent = nullptr;
		while (pcur)
		{
			
			if (pcur->_data > data)
			{
				parent = pcur;
				pcur = pcur->left;
			}
			if (pcur->_data < data)
			{
				parent = pcur;
				pcur = pcur->right;
			}
			if (pcur->_data == data)
				break;
		}
		if (pcur == nullptr)
			return false; //找不到该结点
		if (nullptr == pcur->left)//没有左节点,直接删
		{
			if (parent->left == pcur)
			{
				parent->left = pcur->right;
			}
			if (parent->right == pcur)
			{
				parent->right = pcur->right;
			}
			delete pcur;
		}
		else if (nullptr == pcur->right)
		{
			if (parent->left == pcur)
			{
				parent->left = pcur->left;
			}
			if (parent->right == pcur)
			{
				parent->right = pcur->left;
			}
			delete pcur;
		}
		else
		{
			pnode Lpcur = pcur->left;
			pnode Lparent = nullptr;
			while (Lpcur)
			{
				Lparent = Lpcur;
				Lpcur = Lpcur->right;
			}
			swap(pcur->_data, Lparent->_data);
			delete Lparent;
			Lparent = nullptr;
		}
	}
	void Inorder(pnode root)
	{
		if (root == nullptr)
			return;
		Inorder(root->left);
		cout << root->_data << " ";
		Inorder(root->right);
	}
	void _Inorder()
	{
		Inorder(_root);
	}
private:
	pnode _root;
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值