目录:

  • 代码:
  • 分析:
  • 汇编:

代码:

BTree.h
BTree.c
二叉树(多路平衡搜索树)

SeqList.h
SeqList.c
顺序表

main.c

#include <stdio.h>
#include <stdlib.h>
#include "BTree.h"
#include "SeqList.h"struct Node//树节点
{BTreeNode header;char v;
};void printf_data(BTreeNode* node)
{if( node != NULL ){printf("%c", ((struct Node*)node)->v);}
}
//定义将树的所有节点设置成可以向左一直访问节点
//只是从左开始向右,依次将未尾节点的在子节点指向另一个节点,实现可以向左一直访问
//并不是将整个树结构改变
void thread_via_left(BTreeNode* root, BTreeNode** pp)
{//节点不为空与节点指针不为空//注意:这里其实第一次后只会判断第一个条件,因为pp一直有指向节点指针变量,只是指向的//节点指针变量指向的节点会为空。这是在里面判断if( (root != NULL) && (pp != NULL) ){if( *pp != NULL )//当前这个节点指针不为空{(*pp)->left = root;//将这个指针指向的节点指针的节点的左子节点设为当前传来的节点*pp = NULL;//当前这个指针指向的节点指针的节点的左子节点已经有指向,将这个指针设空,不再指向这个节点}if( root->left == NULL )//如果传来的节点的左子节点为空{*pp = root;//将指向节点指针指向的节点等于传来的节点,表示下次传来的节点将作为这个节点的左子节点}thread_via_left(root->left, pp);thread_via_left(root->right, pp);}
}void thread_via_list(BTreeNode* root, SeqList* list)//将树子节点全部插入顺序表
{if( (root != NULL) && (list != NULL) ){SeqList_Insert(list, (SeqListNode*)root, SeqList_Length(list));thread_via_list(root->left, list);thread_via_list(root->right, list);}
}int main(int argc, char *argv[])
{BTree* tree = BTree_Create();//创建一个树BTreeNode* current = NULL;BTreeNode* p = NULL;SeqList* list = NULL;//顺序表指针int i = 0;struct Node n1 = {{NULL, NULL}, 'A'};struct Node n2 = {{NULL, NULL}, 'B'};struct Node n3 = {{NULL, NULL}, 'C'};struct Node n4 = {{NULL, NULL}, 'D'};struct Node n5 = {{NULL, NULL}, 'E'};struct Node n6 = {{NULL, NULL}, 'F'};BTree_Insert(tree, (BTreeNode*)&n1, 0, 0, 0);BTree_Insert(tree, (BTreeNode*)&n2, 0x00, 1, 0);BTree_Insert(tree, (BTreeNode*)&n3, 0x01, 1, 0);BTree_Insert(tree, (BTreeNode*)&n4, 0x00, 2, 0);BTree_Insert(tree, (BTreeNode*)&n5, 0x02, 2, 0);BTree_Insert(tree, (BTreeNode*)&n6, 0x02, 3, 0);printf("Full Tree: \n");BTree_Display(tree, printf_data, 4, '-');printf("Thread via List:\n");list = SeqList_Create(BTree_Count(tree));//创建顺序表容量是树的节点数量thread_via_list(BTree_Root(tree), list);//调用函数将树节点插入到表中for(i=0; i<SeqList_Length(list); i++){printf("%c, ", ((struct Node*)SeqList_Get(list, i))->v);//输出:ABDEFC}printf("\n");printf("Thread via Left:\n");current = BTree_Root(tree);//取得根节点thread_via_left(current, &p);while( current != NULL ){printf("%c, ", ((struct Node*)current)->v);current = current->left;//输出:ABDEFC}printf("\n");BTree_Destroy(tree);getchar();return 0;
}

分析:









汇编:




线索化二叉树(代码 、分析 、汇编)相关推荐

  1. 数据结构2:中序线索化二叉树为什么要通过pre设置后继结点

    在听尚硅谷韩顺平老师课程的时候这个地方没有理解,先把java中序线索化二叉树代码附上: private HeroNode pre = null;//在递归线索化,pre总是保留前一个结点 /**** ...

  2. 数据结构之线索化二叉树

    线索化二叉树 在一些项目中需要频繁的遍历二叉树,但是二叉树的遍历比单链表的遍历复杂多了,并且递归总是会有额外开销... 能不能像链表那样方便的快速遍历二叉树呢? 线索化二叉树指的是将二叉树中的结点进行 ...

  3. Java实现前中后序线索化二叉树以及遍历

    文章目录 一.线索化二叉树的原理 二.构建线索化二叉树 三.代码实现线索二叉树 一.线索化二叉树的原理 在前面介绍二叉树的文章中提到,二叉树可以使用两种存储结构:顺序存储和链式存储,在使用链式存储时, ...

  4. 线索化二叉树的学习记录

    文章目录 前言 一.线索化二叉树是什么? 二.应用案例 前言 先看一个问题: 将数列 {1, 3, 6, 8, 10, 14 } 构建成一颗二叉树. n+1=7 问题分析: 当我们对上面的二叉树进行中 ...

  5. 数据结构与算法(java):树-二叉树(二叉查找树(BST)、线索化二叉树、哈夫曼树、平衡二叉树【AVL】、二叉树的前中后序遍历)

    二叉树 1.定义 二叉树 就是度不超过2的树(每个结点最多只有两个子结点).如图 2.特殊二叉树 满二叉树 当二叉树的每一个层的结点树都达到最大值,则这个二叉树就是满二叉树. 完全二叉树 叶结点只能出 ...

  6. C语言实现线索化二叉树(先序、中序、后序)

    >>如何用C语言构建一颗二叉树? 第一种方法: ThreadTree A = (ThreadTree)malloc(sizeof(ThreadNode));A->data = { ' ...

  7. java线索二叉树的实现_JAVA递归实现线索化二叉树

    JAVA递归实现线索化二叉树 基础理论 首先,二叉树递归遍历分为先序遍历.中序遍历和后序遍历. 先序遍历为:根节点+左子树+右子树 中序遍历为:左子树+根节点+右子树 后序遍历为:左子树+右子树+根节 ...

  8. 遍历线索化二叉树+图解

    图解 代码实现 package com.atguigu.tree.threadedbinarytree;/*** @创建人 wdl* @创建时间 2021/3/25* @描述*/ public cla ...

  9. 数据结构 - 线索化二叉树(线索化与遍历)

    !!(这里我debug很久才理解过来)** 这里8的前驱为null,所以8的leftType=1,但是6是没有后继的或者说后继为null但是rightType为0(因为后继是在下一个节点来进行连接的, ...

  10. 顺序存储二叉树和线索化二叉树

    二叉树(二) 一.顺序存储二叉树 1.1 顺序存储二叉树的概述 1.2 顺序存储的代码实现 二.线索化二叉树 2.1 线索化二叉树的概述 2.2线索化二叉树的代码实现 2.3 遍历线索化二叉树 一.顺 ...

最新文章

  1. 点分治问题 ----------- 2019-2020 ICPC Asia Hong Kong Regional Contest C.Constructing Ranches[点分治+树状数组]
  2. libevent-signal(2)
  3. VMware vSphere 6.5 配置文档
  4. Java并发编程,3分分钟深入分析volatile的实现原理
  5. 决定equipment download到CRM后是否执行save的因素
  6. Ajax响应处理数据的三种格式(主要使用gson包)
  7. count(*)效率提高_2020年最新整理财务统计函数,学会让你财务统计效率提升95%以上...
  8. [转]Java中的随机数生成器:Random,ThreadLocalRandom,SecureRandom
  9. Flutter 自定义 ImageButton
  10. 大数据项目实战之数据采集
  11. 扩计算机内存,如何增加计算机内存,三种方法来扩展计算机内存
  12. python中response是什么意思_python中的requests,response.text与response.content ,及其编码
  13. linux usb摄像头驱动程序,Linux系统下USB摄像头驱动开发
  14. VirtualBox安装Ubuntu系统过程及问题排查
  15. 小滴课堂工业级paas云平台+springcloudAlibaba+JDK11综合项目实战
  16. python学习——廖雪峰网站
  17. 采购预制发票MIR7 发票校验屏幕格式调整
  18. [2021年最新]国产时序性数据TDenige入门
  19. insert --01--insert into 语句的三种写法
  20. linux单点登录命令,配置RHEV中Linux 虚拟机使用 IPA(IDM)实现单点登录的方法

热门文章

  1. jquery 给iframe里的元素添加事件
  2. iView 一周年了,同时发布了 2.0 正式版,但这只是开始...
  3. (转)用JS实现表格中隔行显示不同颜色
  4. css盒模型中margin很牛逼
  5. maven编译的时候排除junit测试类
  6. HDU1166-敌兵布阵
  7. APPLE STORE
  8. 【2017级面向对象程序设计】第2次成绩排行
  9. Python selenium web UI之Chrome 与 Chromedriver对应版本映射表及下载地址和配置(windows, Mac OS)...
  10. ubuntu系统下如何修改host