数据结构学习之二叉树

一、为什么用二叉树,而不是三个指针域或是根据实际情况指定指针域?

比如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.

                  二元运算表达式树和遍历,

                   确定一个二叉树:先序遍历和中序遍历可以,但先序和后序不能确定。

树的同构:如果两个树通过若干次左右孩子互换,就可说这两颗树是同构的。

     二叉树的表示,建立二叉树,同构判别:

二叉树表示:链表和数组(按完全二叉树的思路来表示)静态链表)

原文地址:https://www.cnblogs.com/plas/p/10023292.html