很显然,二叉树就是二叉树,不明白的可以百度,百度一下,包教包会
二叉树可以使用顺序结构存储,但是一般只用于完全二叉树,因为容易造成对存储空间的浪费
二叉链表:
typedef struct BiTNode
{
TElemType data;
struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;
二叉树的遍历:
前序遍历:规则是先前序遍历左子树,再前序遍历右子树,那么上图的遍历顺序就是:FCADBEHGM
中序遍历:从根结点开始(但并不是先访问根结点),中序遍历根结点的左子树,然后是访问根结点,再中序遍历根结点的右子树。 上图的遍历顺序是:ACBDFHEMG
后序遍历:先访问左右子树,最后访问根结点,遍历顺序是:ABDCHMGEF
层序遍历:一层一层来呗
/* 二叉树前序遍历递归算法*/
void PreOrderTraverse( BiTree T)
{
if(T == NULL)
return;
std::cout << T->data << " "; //显示结点的数据域,也可以替换为其他任何操作
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
/*中序遍历*/
void InOrderTraverse(BiTree T)
{
if(T == NULL)
return;
InOrderTraverse(T->lchild);
std::cout << T->data << " ";
InOrderTraverse(T->rchild);
}
/*后序*/
void PostOrderTraverse(BiTree T)
{
if(T == NULL)
return;
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
std::cout << T->data << " ";
}
根据二叉树遍历的方式可以得到的关于二叉树遍历的性质(为啥可以自己研究研究):
1.已知前序和中序,可以唯一确定一颗二叉树
2.已知后序和中序,可以唯一确定一颗二叉树
二叉树的建立:
/*按照前序输入,AB#D##C,#是扩展的空符号*/
void CreateBiTree(BiTree *T)
{
TElemType ch;
std::cin >> ch;
if(ch == '#')
*T = NULL;
else
{
*T = new BiTNode;
*T->data = ch;
CreateBiTree(t->lchild);
CreateBiTree(t->rchild);
}
}
线索二叉树:
我们可以发现我们对于指针域利用不是很充分,会有空指针域的存在。
线索二叉树就是有前驱后继指针。
树、森林与二叉树的转换:
赫夫曼树及其应用:
带权路径长度最小的二叉树称做赫夫曼树