# 二叉查找树实现类——二叉链表

1. 若它的左子树不空，则左子树上所有结点的值均小于它的根结点的值；
2. 若它的右子树不空，则右子树上所有结点的值均大于它的根结点的值；
3. 它的左、右子树也分别为二叉排序树。

#include <iostream>

using namespace std;

template <class NodeType>
class BSTreeNode
{
public:
NodeType value;
BSTreeNode* lChild, rChild;

BSTreeNode();
};

template <class NodeType>
BSTreeNode<NodeType>::BSTreeNode()
{
lChild = NULL;
rChild = NULL;
}

template <class NodeType>
class BinarySearchTree
{
public:
BinarySearchTree();
BinarySearchTree(BSTreeNode<NodeType> *node);
~BinarySearchTree();

void CreatBinaryTree(BSTreeNode<NodeType> *node);
void DestroyTree(BSTreeNode<NodeType> *node);
void InsertValue(NodeType value);							//NodeType必须重载了==及>操作符
void DeleteNode(BSTreeNode<NodeType> *node);				//NodeType必须重载了=操作符
BSTreeNode<NodeType>* FindValue(NodeType value);			//NodeType必须重载了=,==及>操作符

private:
BSTreeNode<NodeType> *root;
void CopyTree(BSTreeNode<NodeType> *position, BSTreeNode<NodeType> *node);
void InsertValue(BSTreeNode<NodeType> *node, NodeType value);
BSTreeNode<NodeType>* FindValueFrom(BSTreeNode<NodeType> *node, NodeType value);
};

template <class NodeType>
BinarySearchTree<NodeType>::BinarySearchTree()
{
root = NULL;
}

template <class NodeType>
BinarySearchTree<NodeType>::BinarySearchTree(BSTreeNode<NodeType> *node)
{
CreatBinaryTree(node);
}

template <class NodeType>
BinarySearchTree<NodeType>::~BinarySearchTree()
{
DestroyTree(root);
}

template <class NodeType>
void BinarySearchTree<NodeType>::CreatBinaryTree(BSTreeNode<NodeType> *node)
{
CopyTree(root, node);
}

template <class NodeType>
void BinarySearchTree<NodeType>::CopyTree(BSTreeNode<NodeType> *position, BSTreeNode<NodeType> *node)
{
if (NULL == node)
{
position = NULL;
return ;
}

position = new BSTreeNode<NodeType>;
position->value = node->value;

CopyTree(position->lChild, node->lChild);
CopyTree(position->rChild, node->rChild);
}

template <class NodeType>
void BinarySearchTree<NodeType>::DestroyTree(BSTreeNode<NodeType> *node)
{
if (NULL == node)
{
return ;
}

DestroyTree(node->lChild);
DestroyTree(node->rChild);

delete node;
}

template <class NodeType>
void BinarySearchTree<NodeType>::InsertValue(NodeType value)
{
InsertValue(root, value);
}

template <class NodeType>
void BinarySearchTree<NodeType>::InsertValue(BSTreeNode<NodeType> *node, NodeType value)
{
if (NULL == node)
{
node = new BSTreeNode<NodeType>;
node->value = value;
return ;
}

if (node->value == value)
{
return ;
}
else if ( node->value > value)
{
InsertValue(node->lChild, value);
}
else
{
InsertValue(node->rChild, value);
}
}

template <class NodeType>
BSTreeNode<NodeType>* BinarySearchTree<NodeType>::FindValueFrom(BSTreeNode<NodeType> *node, NodeType value)
{
if (NULL == node)
{
return NULL;
}

if (node->value == value)
{
return node;
}
else if (node->value > value)
{
return FindValueFrom(node->lChild, value);
}
else
{
return FindValueFrom(node->rChild, value);
}
}

template <class NodeType>
BSTreeNode<NodeType>* BinarySearchTree<NodeType>::FindValue(NodeType value)
{
return FindValueFrom(root,value);
}

template <class NodeType>
void BinarySearchTree<NodeType>::DeleteNode(BSTreeNode<NodeType> *node)
{
if (NULL == node)
{
return ;
}

BSTreeNode<NodeType> *currentNode = FindValue(node->value);
if (NULL == currentNode)
{
return ;
}

BSTreeNode<NodeType> *lastNode;
while (currentNode != NULL)
{
lastNode = currentNode;
currentNode->value = currentNode->rChild.value;
currentNode = currentNode->rChild;
}

delete currentNode;
lastNode->rChild = NULL;
}


• 本文已收录于以下专栏：

## 数据结构(12)--二叉树的静态链表存储和遍历的实现

• u010366748
• 2016年02月29日 14:46
• 2613

## 二叉查找树 C++实现

• mimi9919
• 2016年04月10日 20:27
• 2232

## 用二叉链表实现二叉查找树(二)

/* 二叉查找树的链表实现： 以及三种遍历方式,删除节点； 查找节点； author:天下无双 Date:2014-5-28 Version:3.0 */ #include #inclu...
• guang_jing
• 2014年05月28日 21:14
• 902

## AVL树实现类——二叉链表实现

（一个人感冒咳嗽不悲剧，悲剧的是全家都感冒咳嗽，没人做事……忽冷忽热的天气得注意保暖） 首先吧，关于AVL树的知识，还是老规矩，Wiki下。 “在计算机科学中，AVL树是最先发明的自平衡二叉查找树...
• BetaBin
• 2012年03月30日 10:44
• 1173

## 二叉树的二叉链表创建

⑴  按满二叉树方式建立 (补充)     在此补充按满二叉树的方式对结点进行编号建立链式二叉树。对每个结点，输入i、ch。i ： 结点编号，按从小到大的顺序输入；ch ： 结点内容，假设是字符。在...
• peace_power
• 2011年12月14日 13:21
• 897

## 二叉链表的建立

二叉链表的建立 为了后面遍历二叉树方便，先介绍建立二叉链表的算法（假设elemtype 为char型）。 假设二叉链表的数据类型描述如刚才所述，为建立二叉链表，用一个一维表数组来模拟队列，存放输入的...
• ll8240456
• 2008年03月22日 20:33
• 938

## 建立二叉树的二叉链表

• axiqia
• 2016年03月25日 22:26
• 3863

## 由先序遍历和中序遍历构造二叉树的二叉链表代码

• ilikeprograming
• 2013年12月28日 11:31
• 1604

## 二叉树之二叉链表的类模板实现

• han____shuai
• 2015年08月13日 00:45
• 1239

## 二叉树的链表表示法实现

• w397090770
• 2012年05月02日 16:41
• 4960

举报原因： 您举报文章：二叉查找树实现类——二叉链表 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)