二叉树详谈
1.二叉树就是有很多节点(n>=0),如果n=0,则此二叉树为空二叉树;当n>0时,二叉树满足条件:只有一个根节点(root),没有前驱节点,但是有0,1或2直接的后继节点
如图所示:
2.二叉树的五种基本形态
(1)空二叉树
(2)只有一个节点的二叉树
(3)只有左子树的二叉树
(4)只有右子树的二叉树
(5)既有左子树又有右子树的二叉树
3.二叉树的两种特殊形态
(1)满二叉树:每个分支点的度数都是2,且叶子节点都在同一个层次上。
(2)完全二叉树:满二叉树都可以和同深度的满二叉树相对比,一一对应。
二叉树的实现(c++)
1.二叉树的创建
template<class Type>
void BinTree<Type>::CreateBinTree(BinTreeNode<Type>*&t)
{
Type Item;
cin >> Item;
if(Item == refval)
t = NULL;
else
{
t = new BinTreeNode<Type>(Item);
CreateBinTree(t->leftChild);
CreateBinTree(t->rightChild);
}
}
2.二叉树的遍历
(1)前序遍历
template<class Type>
void BinTree<Type>::PreOrder(BinTreeNode<Type>*t)const
{
if(t!=NULL)
{
cout<<t-data<<"";
PreOrder(t->leftChild);
PreOrder(t->rightChild);
}
}
(2)中序遍历
void BinTree<Type>::InOrder(BinTreeNode<Type>*t)const
{
if(t!=NULL)
{
InOrder(t->leftChild);
cout<<t->data<<"";
InOrder(t->rightChild);
}
}
(3)后续遍历
void BinTree<Type>::PostOrder(BinTreeNode<Type>*t)const
{
if(t!=NULL)
{
PostOrder(t->leftChild);
PostOrder(t->rightChild);
cout<<t->data<<"";
}
}
3.二叉树的查找
template<class Type> BinTreeNode<Type>*BinTree<Type>::Find(BinTreeNode<Type>*t,const Type &key)const
{
if(t == NULL)
return NULL;
if(t->data == key)
return t;
BinTreeNode<Type>*p = Find(t->leftChild,key);
if(p != NULL)
return p;
return Find(t->rightChild,key);
}