一、基本概念
1、二叉树的概念
一棵二叉树是结点的一个有限集合,该集合或者为空,或者是由一个根节点加上两棵分别称为左子树和右子树的二叉树组成(即一个根节点最多只有两个孩子结点)。
2、二叉树的特点
(1)每个结点最多有两棵子树,即二叉树不存在度大于2的结点(分支数最大不超过2)
(2)二叉树的子树有左右之分,其子树的次序不能颠倒
3、完全二叉树与满二叉树
(1)满二叉树:在一棵二叉树中,如果所有分支结点都存在左子树和右子树,并且所有叶子节点都在同一层上。
(2)完全二叉树:如果一棵具有N个结点的二叉树的结构与满二叉树的前N个结点的结构相同,称为完全二叉树。
4、二叉树的性质
(1)若规定根节点的层数为1,则一棵非空二叉树的第i层上最多有 2 i-1 (i>=1)个结点
(2)若规定只有根节点的二叉树的深度为1,则深度为K的二叉树的最大结点数是2 k -1(k>=0)
(3)对任何一棵二叉树, 如果其叶结点个数为 n0 , 度为2的非叶结点个数为 n2 ,则有n0 =n 2 +1
(4)具有n个结点的完全二叉树的深度k为log2(n+1)上取整。
(5)对于具有n个结点的完全二叉树,如果按照从上至下从左至右的顺序对所有节点从0开始编号,则对于序号为i的结点有:
二、二叉树的基本操作
1、二叉树的创建
利用前序的规则,即先创建根节点,然后在创建右节点,最后创建左结点
2、在二叉树中,赋值运算符的重载
(1)先销毁原来的树
(2)拷贝现在的树
3、二叉树的销毁
利用后序的规则,防止将根节点销毁之后,其的左孩子或者右孩子找不到
上面几个基本操作的代码如下所示:
//二叉树结点的定义
template<class T>
struct BinTreeNode
{
//构造函数
BinTreeNode(const T&data)
:_data(data)
, _pLeft(NULL)
, _pRight(NULL)
{}
BinTreeNode *_pLeft;
BinTreeNode *_pRight;
T _data;
};
//二叉树的定义
template<class T>
class BinTree
{
typedef BinTreeNode<T> Node;
typedef BinTreeNode<T>* pNode ;
public:
//构造函数
BinTree()
:_pRoot(NULL)
{}
BinTree(const T* array, size_t size, const T& invalid)
{
size_t index = 0;//防止常引用
_CreateBinTree(_pRoot, array, size, index, invalid);//构造树
}
//拷贝构造函数
BinTree(const BinTree& bt)
{
_pRoot = _CopyBinTree(bt._pRoot);
}
//赋值运算符重载
BinTree& operator=(const BinTree& bt)
{
if (this != &a