【C++搜索二叉树】


搜索二叉树

搜索二叉树是一个排序的树,或者是一课空树,搜索二叉树有三种性质。

  1. 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值。
  2. 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值。
  3. 它的左右子树也分别为二叉搜索树。

在这里插入图片描述
第一个二叉树符号搜索二叉树的条件,第二个如果把10的结点换成比13大的数或者比8小的数都不会满足搜索二叉树的条件,第三个二叉树如此。

如何生成一个搜索二叉树

生成一颗树,我们树的每个结点都要有指向左子树和指向右子树的两个指针,和一个存放数据的变量。我们可以写一个结构体或类来表示。树可以是一个模板。

template <class K>
struct BSTreeNode{
	BSTreeNode(const K& key)
	:_left(nullptr),_right(nullptr),_key(key){}
	BSTreeNode<K>* left;
	BSTreeNode<K>* right;
	K _key;
};
//树的每一个结点。

如果最开始是一个空树,我们直接把根结点的结构体中赋值,然后把指向左子树和指向右子树的指针指向nullptr。

树的构造

template<class K>
BSTree{//树的一个类
	typedef BSTreeNode<K> Node;
private:
	Node* root;
};

树结点的插入

迭代法
bool Insert(const K& key)
{
	if(root == nullptr)
	{
		root = new Node(key);
		return true;
	}
	Node* prev = root;
	while(root)
	{
		prve = root;
		if(root->_key > key)
		{
			root = root->left;
		}
		else if(root->_key < key)
		{
			root = root->right;
		}
		else
		{
			Node* node = new Node(key);
			if(prev->_key > key)
			{
				prev->right = node;	
			}
			else if(prev->_key < key)
			{
				prev->left = node;
			}
			return true;
		}
	}
	return false;
}
递归法
bool InsertR()
{
	_InsertR(root,key);//因为root是私有的,所以我们需要嵌套
}
private:
	bool _InsertR(Node* root,const K& key)
	{
		if(root == nullptr)
		{
			Node* node = new Node(key);
			return true;
		} 
		if(root->_key > key)
		{
			_InsertR(root->left,key);
		}
		else if(root->_key < key)
		{
			_InsertR(root->right,key);
		}
		if(root->_key == key)
		return false;
	}

树的拷贝构造

如果调用自己生成的拷贝构造,会是浅拷贝,所以需要自己生成拷贝构造。
前序方式拷贝构造

BSTree(const BTSree<K>& bst)
{
	root = Copy(bst._root);
}
private:
Node* Copy(Node* _root)
{
	if(_root == nullptr)
	{
		return nullptr;
	}
	Node* newroot = new Node(_root->_key);
	newroot->left = Copy(_root->left);
	newroot->right = Copy(_root->right);
	return newroot;
}
析构函数

后序方式析构

~BSTree()
{
	void Destory(root);
}
private:
void Destory(Node*& root)
{
	if(root == nullptr)
	return;
	Destory(root->left);
	Destory(root->right);
	delete root;
	root = nullptr;
}
赋值构造函数
BSTree<k>& operator=(const BSTree<k> bst)
{
    swap(root,bst.root);
    return *this;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值