神奇的树
书的内容比较多而且有些抽象,这篇只涉及一些原理,定义等,不涉及code,以后会有对程序的文章。
“树”的概念是将一个一维数组转化为二位图形,而起到转化作用的是一些定义:**假设在数组中去一个第i个,那么他的上一支就是i/2(结果要去整)。他的下一支是(i*2+x)**并且不包含回路。基于这个特点它拥有很多特殊的性质。
①书中任意两个节点只有唯一的一条路。
②一棵树如果有n个节点,它恰好有(n-1)条边。
③在树中加一条边会构成一个回路。
还有一个一维数组,顺序不同,建立的树的形状不同,也会有差别。
二叉树(使用最广的树结构)
二叉树有两种特殊结构,满二叉树和完全二叉树,
二叉树就是一个父节点最多能拥有两个儿子,可以没有。每个父节点都拥有两个儿子的是满二叉树,相反即是完全二叉树。
而特殊的完全二叉树又别定义为堆,当父节点都要比子节点大时成为最大堆,相反就是最小堆。这可以用来排序。试想一下,每次调整,祖根上的值只有两种情况,最大或最小,每次将这个值提取,就可以完成排序,这种排序难度与快速排序相同。
树结构的建立
①可以定义n来记录数组长度,然后使用for循环录入数组,最后使用siftup(n)调整数。
②从叶节点开始叶节点与父节点调整,然后使用递归的思想直至祖根这样,树就会被调整为堆。
还有一种特殊的树结构——线段树
线段树可看做将一段顺序数据用二分法直至分至每个单元为叶节点,这是我对线段树的理解这里不果断涉及(其实线段树我是刚接触也不懂,我会加快完善关于树的文章)