一、为什么用二叉树,而不是三个指针域或是根据实际情况指定指针域?
比如3,那么有n个节点就是有3n个指针域,其中边只有n条,那么只有n-1个域非空,有2n+1个域为空,浪费空间。而对于2,那么就只有n+1个域为空。而比如说根据实际来确定指针域,对于实现上是非常困难的。
度为2的树就是二叉树。
斜二叉树/完美二叉树(满二叉树)/完全二叉树(是建立在满二叉树的基础上的树,补齐后就是满二叉树,否则顺序不一致就不是完全二叉树)
二、二叉树特性
1.每层节点个数为当前层数的2的幂次。2的k次方。
2.深度为k的二叉树最大节点数:2的k次方减去1。
3.对于任何非空二叉树,叶子节点的个数等于度为2的非叶节点个数加1。(通过查看树的边的个数,n0,n1,n2分别为节点数为012的节点个数,有公式:n0+n1+n2-1=0*n0+1*n1+2*n2=====》推算出:n0=n2+1)
4.树的遍历方法:先序,中序,后序,层次遍历。
三、二叉树的存储结构:
1.顺序存储结构
完全二叉树:由上而下从左到右存储n个节点的完全二叉树的节点父子关系:
非根节点的父亲节点序号为:i/2(i>1)
节点的左孩子:2i(2i<=n,否则没有左孩子)
节点右孩子为:2i+1(2i+1<=n,否则没有右孩子)
一般二叉树可以采用这种通过数组来存储的顺序存储结构,但会造成空间的浪费。
2.链表存储
class TreeNode{
Object Data;
BinTree Left;
BinTree Right;
}
四、二叉树的遍历:
1.先序遍历
遍历过程:根节点---》左子树-----》右子树
2.中序遍历:先递归左子树------》根节点----》遍历右子树======》(注意访问过程中的非根节点访问依旧按照此顺序)
3.后序遍历:左子树---》右子树---》根节点
这三种遍历都是在一条线路上只是遍历的起始位置不同
上面的也是用递归思想来遍历的。
二叉树的非递归遍历:
中序遍历非递归遍历算法: 堆栈
遇到节点就压如栈,并比哪里它的左子树 ,当左子树遍历结束,从栈顶弹出并访问它,然后按右子树再去中序遍历该节点的右子树
注:层序遍历是通过队列老实现的。将遇到的所有节点的依次右子树放入队列,然后按先进先出的原则,一次提取并访问它的子树,还是按上述原则一次将数据放入队列中。就可以实现层序遍历。
实现应用:输出叶子节点,可以通过遍历中的加入if判断语句,是否有左右子树,如果没有就是叶子节点。
高度,二叉树高度等于左右子树最大高度加1。递归方法求左右子树高度,判断最大值然后加1.
二元运算表达式树和遍历,
确定一个二叉树:先序遍历和中序遍历可以,但先序和后序不能确定。
树的同构:如果两个树通过若干次左右孩子互换,就可说这两颗树是同构的。
二叉树的表示,建立二叉树,同构判别:
二叉树表示:链表和数组(按完全二叉树的思路来表示)静态链表)