树的基本概念:
树的度:树中所有节点中最大的度;
节点的层数:节点的层数从树根开始计算,根节点是第一层,依次向下为第2.3.,,,n层,
树的深度:树中节点的最大层数称为树的深度。
满二叉树:二叉树中除最下一层的叶节点外,每层的节点都有2个子节点。
完全二叉树:二叉树中除最后一层外,其他各层的节点数都达到最大个数,且最后一层叶节点按照从左向右的顺序连续存在,只缺最后一层右侧若干节点。
满二叉树一定是完全二叉树,而完全二叉树不一定格式满二叉树。
二叉树的顺序存储:
采用一维结构数组来表示,如果是完全二叉树的话,直接进行存储就可以;
但是如果是非完全二叉树,则必须补全二叉树成为完全二叉树(用#等符号),然后进行顺序存储,否则的话就不能按照下面的规则来推算节点之间的关系:
节点i,父亲节点为(i-1)/2,子节点为2*i+1 2*i+2。
顺序存储的缺点就是浪费空间,因为其中可能填充了大量无用的数据,比如上面的#。所以一般只适用于完全二叉树;
二叉树的链式存储:
采用结构体类型,结构体中包括左子树节点指针、右子树节点指针、元素数据以及父节点指针。
初始化二叉树:
就是初始化二叉树的根,包括申请节点空间,为节点中的元素赋值 ,左右子树均为空就可以了。
查找节点、计算二叉树的深度、清空二叉树(通常free(treeNode)之后还会treeNode=NULL,这样不仅指针所指向的空间被释放了,这个指针也被赋值成为空指针,否则这个指针就成为了野指针)都可以用递归的方式!!!
二叉树的遍历:
按层遍历二叉树,一般不能使用递归算法,而是使用给一个循环队列进行处理;
先序遍历、中序遍历以及后序遍历可以采用递归的思想。
二叉树按层遍历:
1.针对二叉树的宽度优先遍历。
2. 宽度优先遍历常使用队列结构。
3. 还要打印出行号。
思路:
last表示正在打印的当前行的最右节点
nlast表示下一行的最右节点
如何更新nlast:nlast一直跟踪新加入的节点,因为新加入的节点一定是下一行的最右节点;
二叉树的序列化和反序列化:
将二叉树记录成文件的过程叫做二叉树的序列化,又叫二叉树的持久化过程;
把文件中的记录还原成二叉树的过程叫做二叉树的反序列化过程。
序列化的方式:
根据先序遍历序列化;
根据中序遍历序列化;
根据后序遍历序列化;
按层序列化;
用一个特殊字符表示一个二叉树节点值的结束的意义:防止出现歧义
先序遍历对二叉树进行序列化:
1. 假设序列化结果为str,初始时str为空字符串;
2.先序遍历二叉树时如果遇到空节点,在str末尾加上“#!”
3. 如果遇到不为空的节点,假设节点值为3,就在str的末尾加上“3!”
一棵二叉树通过先序遍历得到的结果,如何进行反序列化:
先将str转换成字符串类型的数组,代表二叉树先序遍历的节点顺序
1.选择用什么遍历方式序列化,就选择用什么方式反序列化
2.一棵树序列化的结果是唯一的,唯一的结果生成的二叉树也是唯一的。
按层遍历的方式对二叉树进行序列化:
1. 用队列来进行二叉树的按层遍历,即宽度优先遍历
2.除了访问节点的顺序是按层遍历之外,对结果字符串的处理,与之前介绍的处理方式一样
3. 反序列化过程同理
二叉树的深度和高度问题,请查看博客http://blog.csdn.net/fanpei_moukoy/article/details/23828603