C语言反汇编04:二叉树层级遍历

网友投稿 652 2022-09-19

C语言反汇编04:二叉树层级遍历

C语言反汇编04:二叉树层级遍历

二叉树遍历的方法:首先,根结点 1 入队;根结点 1 出队,出队的同时,将左孩子 2 和右孩子 3 分别入队;队头结点 2 出队,出队的同时,将结点 2 的左孩子 4 和右孩子 5 依次入队;队头结点 3 出队,出队的同时,将结点 3 的左孩子 6 和右孩子 7 依次入队;不断地循环,直至队列内为空。

使用层级遍历的案例,输出结果是1 2 3 4 5 6 7

1.C语言二叉树源码2.反汇编分析

1.C语言二叉树源码

#include #include #define TElemType int //初始化队头和队尾指针开始时都为0 int front = 0, rear = 0; typedef struct BiTNode { TElemType data;//数据域 struct BiTNode* lchild, * rchild;//左右孩子指针 } *BiTree; void CreateBiTree(BiTree* T) { *T = (BiTNode*)malloc(sizeof(BiTNode)); (*T)->data = 1; (*T)->lchild = (BiTNode*)malloc(sizeof(BiTNode)); (*T)->rchild = (BiTNode*)malloc(sizeof(BiTNode)); (*T)->lchild->data = 2; (*T)->lchild->lchild = (BiTNode*)malloc(sizeof(BiTNode)); (*T)->lchild->rchild = (BiTNode*)malloc(sizeof(BiTNode)); (*T)->lchild->rchild->data = 5; (*T)->lchild->rchild->lchild = NULL; (*T)->lchild->rchild->rchild = NULL; (*T)->lchild->lchild->data = 4; (*T)->lchild->lchild->lchild = NULL; (*T)->lchild->lchild->rchild = NULL; (*T)->rchild->data = 3; (*T)->rchild->lchild = (BiTNode*)malloc(sizeof(BiTNode)); (*T)->rchild->lchild->data = 6; (*T)->rchild->lchild->lchild = NULL; (*T)->rchild->lchild->rchild = NULL; (*T)->rchild->rchild = (BiTNode*)malloc(sizeof(BiTNode)); (*T)->rchild->rchild->data = 7; (*T)->rchild->rchild->lchild = NULL; (*T)->rchild->rchild->rchild = NULL; } //入队函数 void EnQueue(BiTree* a, BiTree node) { a[rear++] = node; } //出队函数 BiTNode* DeQueue(BiTNode** a) { return a[front++]; } //输出函数 void displayNode(BiTree node) { printf("%d ", node->data); } int main() { BiTree tree; //初始化二叉树 CreateBiTree(&tree); BiTNode* p; //采用顺序队列,初始化创建队列数组 BiTree a[20]; //根结点入队 EnQueue(a, tree); //当队头和队尾相等时,表示队列为空 while (front < rear) { //队头结点出队 p = DeQueue(a); displayNode(p); //将队头结点的左右孩子依次入队 if (p->lchild != NULL) { EnQueue(a, p->lchild); } if (p->rchild != NULL) { EnQueue(a, p->rchild); } } return 0; }

代码功能简介:创建一个二叉树结构体,依次填充二叉树的数据,在使用层级遍历的时候,每次按照左右的顺序依次从根节点的层级一级级的往下面遍历。

mov rax,qword ptr [rax] 4字64位rax中的指针赋值给rax,对应的代码是(*T),实际数据给raxmov dword ptr [rax],1 将1赋值给rax,对应的代码是=1第一个ptr[T]是给指针赋值寄存器,第二个ptr[rax]是把结构体中的数据进行赋值;因为结构体这个时候已经完成了初始化,里面的数据已经放到寄存器中了,指针地址也完全知晓

后面的差不多功能都类似的。

赋值引用的时候使用lea = load effective address,加载有效地址call 调用预创建的方法创建一个二叉树结构;

在定义的时候不会开辟内存空间,可以看到call之前没有任何的push,这是x64的结构,默认rdx,rcx作为方法的参数给传递,不需要x86那一套push,太复杂了;lea 是使用引用的数据;

lea其实也是给call的参数赋值,注意一下跳转的位置,其他的都比较正常。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Windows最常用的快捷键(纯干货)
下一篇:手把手教你进行Scrapy中item类的实例化操作(scrapy.item)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~