二叉树

一.二叉搜索树的特点

二叉搜索树是一种特殊的二叉树

它的特点是:

1.左子树的所有节点均比根节点的值小

2.右子树的所有节点均比根节点的值大

3.左右子树都是二叉搜索树

4.中序遍历序列是有序的

5.一般二叉搜索树不允许有重复值

当然,二叉搜索树默认是升序的,不过也可以实现成降序的样子

只需要更改一下第1条和第2条即可,

第一条改为左子树的节点都要大于根节点

第二条改为右子树的节点都要小于根节点

此时实现出来的二叉搜索树就是降序的

例如:这个树就是一个二叉搜索树

二.我们要实现的大致框架

#pragma once
#include <iostream>
using namespace std;
//BST排升序:左孩子小于我,  右孩子大于我
//排降序:   左孩子大于我,  右孩子小于我


//节点的结构体
template <class K>
struct BSTreeNode
{
	BSTreeNode<K>* _left = nullptr;
	BSTreeNode<K>* _right = nullptr;
	K _key;
	BSTreeNode(const K& key)
		:_key(key)
	{}
};


template<class K>
class BSTree
{
	typedef BSTreeNode<K> Node;
public:
	//非递归实现insert.find,erase
	bool Insert(const K& key);


	Node* Find(const K& key);


	bool Erase(const K& key);


	//析构函数  后续遍历析构
	~BSTree();
	
	//C++11新语法
	BSTree() = default;//强制生成默认构造
	
	//拷贝构造
	//先序遍历构造
	BSTree(const BSTree<K>& bst);


	//赋值运算符重载:现代版本
	BSTree<K>& operator=(BSTree<K> bst);


	void InOrder()
	{
		_InOrder(_root);
	}


	//递归实现insert.find,erase
	Node* FindR(const K& key)
	{
		return _FindR(_root,key);
	}


	bool InsertR(const K& key)
	{
		return _InsertR(_root, key);
	}


	bool EraseR(const K& key)
	{
		return _EraseR(_root, key);
	}
	
private:
	//拷贝构造函数的子函数
	Node* _Copy(const Node* root);
	//析构函数的子函数
	void _Destroy(Node*& root);
	//中序遍历的子函数
	void _InOrder(Node* root);
	//find的子函数
	Node* _FindR(Node* root, const K& key);
	//insert的子函数
	bool _InsertR(Node*& root, const K& key);
	//erase的子函数
	bool _EraseR(Node*& root, const K& key);
	
	//给根节点_root缺省值nullptr
	Node* _root = nullptr;
};

这是Key模型的版本,最后我们要修改一份Key-Value版本

template <class K>

这里模板给K的原因是:贴合K模型而已,所以没有用T

这里的R : recursion(递归的英文)

//给根节点_root缺省值nullptr
Node* _root = nullptr;

这里直接给根节点_root缺省值nullptr了,编译器默认生成的构造函数就会使用这个缺省值

这里补充一点:

//C++11新语法:给default这个关键字增加了一个含义
BSTree() = default;//强制生成默认构造

全部评论

相关推荐

起名字真难233:人家只有找猴子的预算,来个齐天大圣他们驾驭不住呀😂😂
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务