二叉树在数据分析中的出场率可以说和数组相当,远超链表。很多游戏都以二叉树的结构为主,其中最典型的游戏就是《传奇永恒》,这款游戏中百分之80的数据结构都是用的二叉树,或者是多个二叉树的相互嵌套。那么下面我们先来说一下二叉树结构的优点。
首先二叉树在内存空间的占用上很节省资源,它结合了链表的优点,并不需要连续的内存,这样就可以将很多零散的内存利用起来。其次,二叉树由于排列方式的特殊性,让我们在查找任意ID时都能以最短的时间找到,因为其节点ID都是以单向增加或者减少的方式排列的。如果一个二叉树的总节点数是n,那么我们找到其中任意节点所用的读取次数最多为以2为低n的对数。
下面我们在OD中对二叉树的结构进行分析(如图)
在反汇编窗口中,一般二叉树是以两个+4偏移为根节点,在左右子树遍历时会以一个jmp代码将+0和+8两个二叉树隔开,这样每一次循环左右子树不会同时执行,而最明显的特点就是会有一个4的倍数加1的偏移和0进行比较,作为二叉树开始和结束的判断标志位。所以每当我们在反汇编代码中遇到这种代码时,都可以直接判断出这是一段二叉树代码。
而在数据窗口中,如果[[xxxxxxxx+4]+4]是一个二叉树的根节点的话,那么[xxxxxxxx+4]既是二叉树即将开始的地址,也是二叉树遍历结束的地址,这时的标志位为01,我们可以利用这个特点来对一些无法通过访问得到汇编代码的二叉树基地址进行搜索(如图)
上面的汇编代码中所显示的最常见的二叉树代码,当然有时候我们还会遇到一些变形的二叉树代码,虽然遍历结果是一样的,但是分析起来很麻烦,这是我们也可以通过对二叉树节点进行访问,来尝试查找是否有常见二叉树代码访问该节点。
以上就是二叉树的一些特点,和数据分析时遇到二叉树的处理办法,懂得了这些,我们在遇到二叉树时会看的更加清晰,更加快捷。