数据结构基础--二叉树
先序遍历先从二叉树的根开始,然后到左子树,再到右子树。
遍历的结果是:ABDCEF
中序遍历先从左子树开始,然后到根,再到右子树。
遍历的结果是:DBAECF
后序遍历先从左子树开始,然后到右子树,再到根。
遍历的结果是:DBEFCA
打印自己,然后先遍历左节点再遍历右节点
这里的栈用处是为了保存二叉树的结构,以弥补二叉树无法获取父节点的结构特性。
不过需要注意的是后入栈的为左孩子,以保证优先遍历左侧。
第一个栈的处理顺序为,自上而下,自右而左。经过第二个栈的逆序,就变成了自下而上,自左而右。
每次将新节点加入队列时,将nlast更新成新节点。
当当前打印的节点等于last,执行换行并将last更新到下一行nlast。
举个例子(用 ! 分割,用 # 表空):
将序列化字符串转化成数组(比如这里通过 ! 分割)
所以我们需要引入一个变量 setleft 来确定下一次需要构建的节点方向。
每次构建新节点之后,下一次都会尝试构建其左侧节点。
而每次遇到空节点后,都会将顶元素推出,并尝试构建其的右侧节点。
因为他的队列,只负责记录下一次想要处理的节点。
并不需要在意左右与层级倒退,只需要处理节点为空的情况即可。
如下图中第三棵二叉树。
2节点的子树下方,左侧高度为2,右侧高度为0。所以不是一个平衡二叉树。
一旦一侧子节点为空,另一侧若高度大于2,则判定为否
目的都是提高搜索二叉树的效率,调整代价降低。
第一个错误的节点为第一次降序较大的节点
第二个错误的节点为第二次降序较小的节点
第一个错误的节点为此次降序较大的节点
第二个错误的节点为此次降序较小的节点
除最后一层无任何子 节点 外,每一层上的所有结点都有两个子结点二叉树。
从图形形态上看,满二叉树外观上是一个三角形
这种满二叉树的层数为L,节点数为N。
则N = 2^L-1 ,L = log(N+1)
满二叉树的结点要么是叶子结点,度为0,要么是度为2的结点,不存在度为1的结点。
在满二叉树的基础上,最后一层所有的结点都连续集中在最左边,这就是完全二叉树。
先遍历左子树左边界,再遍历右子树左边界。从而判断哪边为满二叉树。
满二叉树侧,N=2^H。非满二叉树侧,递归。
每层只遍历一个节点的子树,总计LogN。
每个子树获取右子树左边界遍,需要经历LogN次计算。
总复杂度O((LogN^2))
如果从下标从1开始存储,则编号为i的结点的主要关系为:
双亲:下取整 (i/2)
左孩子:2i
右孩子:2i+1
如果从下标从0开始存储,则编号为i的结点的主要关系为:
双亲:下取整 ((i-1)/2)
左孩子:2i+1
右孩子:2i+2
2的后序节点为3,2的前驱节点为1
下图中2,1两节点距离为2。3,5节点距离为5
三个情况下最大的结果,就是以head为头节点的整棵树上最远的距离。
Swift 算法实战之路:二叉树
左神牛课网算法课