1、二叉树简介:二叉树是每个结点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。
相关知识:
树的深度:树中最大的结点层。
结点的度:结点子树的个数。
树的度: 树中最大的结点度。
叶子结点:也叫终端结点,是度为 0 的结点;
分枝结点:度不为0的结点;
满二叉树:除了叶子节点外,为一个节点都有左右子树的二叉树,每一层都满的二叉树。
完全二叉树:树中只有最后一层有空缺且从右向左连续空缺的二叉树。
平衡二叉树:又称AVL树,数中的每个节点左右子树高度差最多不想差1。
把一棵完全二叉树从上到下,从左到右依次编号,其中编号为i的点(1<i<n),若满足2i<n则该节点的左子树为2i,右子树为2i+1.
2、二叉树性质:
(1) 在非空二叉树中,第i层的结点总数不超过,i≥1。
(2) 深度为h的二叉树最多有个结点(h>=1),最少有个结点。
(3) 对于任意一棵二叉树,如果其叶结点数为,而度数为2的结点总数为,则。
(4) 具有n个结点的完全二叉树的深度为。
(5)把一棵完全二叉树从上到下,从左到右依次编号,其中编号为i的点(1<i<n),若满足2i<n则该节点的左子树为,右子树为。
3、二叉树的声名与创建:递归建树。
typedef struct binarytree
{
char nValue;
struct binarytree *pleft;
struct binarytree *pright;
}bitree;
void CreateBiTree(binarytree **pTree)
{
char nNum;
scanf("%c",&nNum);
if(nNum == '0')return;
//根
*pTree = (binarytree*)malloc(sizeof(binarytree));
(*pTree)->nValue = nNum;
(*pTree)->pleft = NULL;
(*pTree)->pright = NULL;
//左
CreateBiTree(&((*pTree)->pleft));
//右
CreateBiTree(&((*pTree)->pright));
}
4、二叉树的遍历:
(1)先序遍历:首先访问根,再先序遍历左子树,最后先序遍历右子树。(根左右)
void PreorderTraversal(binarytree *pTree)
{
if(pTree == NULL)return;
//根
printf("%d ",pTree->nValue);
//左
PreorderTraversal(pTree->pleft);
//右
PreorderTraversal(pTree->pright);
}
(2)中序遍历:首先中序遍历左子树,再访问根,最后中序遍历右子树。(左右根)
void InorderTraversal(binarytree *pTree)
{
if(pTree == NULL)return;
//左
InorderTraversal(pTree->pleft);
//根
printf("%d ",pTree->nValue);
//右
InorderTraversal(pTree->pright);
}
(3)后序遍历:首先后序遍历左子树,再后序遍历右子树,最后访问根。(左右根)
void LastorderTraversal(binarytree *pTree)
{
if(pTree == NULL)return;
//左
LastorderTraversal(pTree->pleft);
//右
LastorderTraversal(pTree->pright);
//根
printf("%d ",pTree->nValue);
}
(4)层序遍历:即按照层次访问,先访问根,访问左右儿子,再访问儿子的儿子。
二叉树遍历示例: