顺序存储结构仅适用于完全二叉树,在最坏的情况下,一个深度为k且只有k个结点的单支树(树中不存在度为2的结点)却需要长度为2^k-1的一维数组。这造成了存储空间的极大浪费,所以对于一般二叉树,适合采用链式存储结构:
二叉链表存储结构:typedef struct BiTNode{
TElemType data; //结点数据域
struct BiTNode *lchild,*rchild;//左右孩子指针
}BiTNode,*Bitree;
先序创建二叉链表: void CreateBiTree(BiTree &T)
{//先序创建二叉树T
cin >> ch;
if(ch=='#')
{//递归结束,建空树
T=NULL;
}
else
{
T=new BiTNode;//生成根结点
T->data=ch;//根结点数据域置为ch
CreateBiTree(T->lchild);//递归创建左子树
CreateBiTree(T->rchild);//递归创建右子树
}
}
中序遍历二叉树: void InOrderTraverse(BiTree T)
{//中序遍历二叉树T的递归算法
if(T)
{
InOrderTraverse(T->lchild);
cout<<T->data;
InOrderTraverse(T->rchild);
}
}
改变cout的位置便是先序和后续遍历二叉树
复制二叉树:void Copy(BiTree T,BiTre &NewT)
{//复制一颗和T完全相同的二叉树
if(T==NULL)
{//如果是空树,递归结束
NewT==NULL;
return;
}
else
{
NewT=new BiTNode;
NewT->data=T->data;//复制根节点
Copy(T->lchild,NewT->lchild);//递归复制左子树
Copy(T->lchild,NewT->rchild);//递归复制右子树
}
}
计算二叉树的深度: void Depth(BiTree T)
{//计算二叉树T的深度
if(T==NULL)
{//如果是空树,深度为0,递归结束
return 0;
}
else
{
m=Depth(T->lchild);//递归计算左子树深度计为m
n=Depth(T->rchild);//递归计算左子树深度计为n
if(m>n)
{//二叉树深度为m与n的较大者加1
return(m+1);
}
else
{
return(n+1);
}
}
}
统计二叉树中结点的个数: int NodeCount(BiTree T)
{//统计二叉树T中结点的个数
if(T==NULL)
{//如果是空树,则结点个数位0,递归结束。
return 0;
}
else
{//否则结点个数为左子树结点个数+右子树结点个数+1
return NodeCount(T->lchild)+NodeCount(T->rchild)+1;
}
}