(前面链表,栈,队列后期再说,我先学树和图,之前学过一遍数据结构,树和图掌握的不是很好)
1.二叉树
定义:
二叉树(Binary Tree)是 n (n>=0)各结点的有限集合,该集合或者为空集,或者有一个根基诶单和两个互不相交的分别称为根节点的左子树和右子树的二叉树组成。(度的定义:指的是在树中,,该节点子树的个数称为度,一个满二叉树,根节点两个,叶子节点零个,其他都为二)PS:区分左右哦,不然就乱套了。二叉树,是度为二的树,二叉树的每一个节点最多只有二个子节点,且两个子节点有序
放一张满二叉树的图:
完全二叉树:
完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。PS:意思就是跟满二叉树的顺序完全一样,但是不全,位置也一样,且是连续的(像这样)。
下图这样不是完全二叉树:
二叉树的性质:
1.:在二叉树的第i层上至多有个结点(i>=1)
2:深度为k的二叉树至多有个结点(k>=1)
3:对任何一个二叉树T,如果其终端结点数为,度为2 的结点数,则=+1。 n=++。
4:具有n个结点的完全二叉树的深度为(log的没找到只能放图片了)
二叉树的遍历:
1:前序:根-->左--->右
ABDGHCEIF
2:中序: 左-->根-->右
GDHBAEICF
3:后序: 左-->右-->根
GHDBIEFCA
这里就不放这几种遍历方式的C语言代码了,理解思路就好
构造二叉树:以前序为例,将前序拓展为AB#D##C##
/*按前序输入二叉树中结点的值(一个字符) */
/* #表示空树,构造二又链表表示二叉树T。*/
vold CreateBiTree (BiTree *T){
TElemType ch;
scanf ("%c",&ch) ;
if (ch=='#')
*T-NULL;
else
{
*T==(BiTree) malloc (sizeof (BiTNode) ) ;
if(!*T)
exit (OVERFLOW) ;
(*T) ->data=ch; //生成根鮚点
CreateBiTree(&(*T)->lchild); /*构造左子树*/
CreateBiTree( &(*T)->rchild); /*构造右子树*/
}
}
线索二叉树: 指向前驱和后继的指针称为线索,加上线索的二叉链表就称为线索二叉树。