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小时内删除侵权内容。
暂时没有评论,来抢沙发吧~