[黑科技]. 二叉树遍历

Par @Martin dans le
Tags :

这个单独弄出来, 只是因为自己懒, 不想每次遍历时都重敲代码, 就做下笔记, 用到的时候 粘贴 复制…

就是先分析下游戏二叉树的结构, 然后自己模拟着也定义一个.

#pragma pack (push,1)
typedef struct _RoleTree {
    DWORD dwLBase;      //+0x0    左树
    DWORD dwSBase;      //+0x4    上一层树的地址
    DWORD dwRBase;      //+0x8    右树
    int iID;            //+0xC    二叉树ID
    DWORD dwPBase;      //+0x10    数据数据指针
    byte bTyep;         //+0x14
    byte bEnd;          //+0x15    //是否到了尾节点 0为没到, 1为到了, 注意尾节点即没有左右树也没有了数据指针
} RoleTree, *pRoleTree;
#pragma pack(pop)

void GetTreeAddr() {
    int iObject = ReadMemoryPtrData<int>(Role_BaseAddr);
    iObject = ReadMemoryPtrData<int>(iObject + 0x64);
    iObject = ReadMemoryPtrData<int>(iObject + 0x4);
    TraceOutA("二叉树基址为: 0x%X", iObject);
    this->TraverRoleTree(iObject);
}

void TraverRoleTree(int iObject) {
    pRoleTree pTree;
    pTree = (pRoleTree)iObject;

    if (!pTree->bEnd) {//[[[pTree->dwPBase+0x1E0]+0x4]+0x2458]
        int tmp = ReadMemoryPtrData<int>(pTree->dwPBase + 0x1E0);
        if (tmp) {
            tmp = ReadMemoryPtrData<int>(tmp + 0x4);
            TraceOutA("二叉树ID为: 0x%X--数据对象为: 0x%X--怪物名: %s", pTree->iID, tmp, (char*)(tmp + 0x34));
        }

        TraverRoleTree(pTree->dwLBase);
        TraverRoleTree(pTree->dwRBase);
    }
}