二叉树相关问题

时间:2021-05-20 17:32:47

树的基本概念:

树的度:树中所有节点中最大的度;

节点的层数:节点的层数从树根开始计算,根节点是第一层,依次向下为第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