搜索二叉树
搜索二叉树是一个排序的树,或者是一课空树,搜索二叉树有三种性质。
- 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值。
- 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值。
- 它的左右子树也分别为二叉搜索树。
第一个二叉树符号搜索二叉树的条件,第二个如果把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;
}