线索二叉树 --->树
2016-06-11 17:11
274 查看
为什么需要线索二叉树呢?
我想正如程序员发觉单链表并不总能满足他们设计的程序某些要求的时候,发明了双向链表来弥补一样,线索二叉树也是在需求中被创造的!
那普通的二叉树到底有什么缺陷呢?
一,浪费空间。二,浪费时间,三,浪费青春
一共浪费了40个字节的空间。32b位的机器用32除以8等于4,这是代表一个指针用4个字节来表示。
结合上图我们发现一个树通过中序遍历,每隔开一个都有两个位置可以存放两个指针,一个存放前驱一个存放后继,如果想找到一个结点的前驱和后继通过这两个指针就可以了。
上图经过中序遍历后结果是
红色就是。后序和前序是不可以的。我们发现红色的结点都是刚才“^”造成浪费的结点,利用中序遍历刚好它们均处于字符中间,可以很好地利用“^”来存放前驱和后继的指针。
上图经过中序遍历后结果是
黄色说明只有一个空闲的指针位置,如果是这样的话我们就面临一个问题,机器怎么识别到底是存放指针还是线索?
通过上面的讲解,大家应该多少了解了线索二叉树是干什么的了。这里在总结一下就是,二叉树的普通存储结构是存在缺陷的,浪费空间等等,那么多空指针就是为了表明结束,但是我们通过观察发现当中序遍历二叉树的时候,会形成一种现象,每隔一个结点其实都存在两个空闲的指针Null,浪费了内存,我们可以将这指针作为一种索引指向结点的前驱或者后继,这样会减少浪费,并且在拿到一个结点的时候快速的找到它的前驱和后继。
为此呢,我们将已经定义好的结构进行“扩容”。
多了两个枚举类型的常量,用来作为标志,虽然结点的内存空间变大了,但是还是远远利大于弊。
ltag为0时候指向该结点的左孩子,为1时指向该结点的前驱。
rtag为0时指向该结点的右孩子,为1时指向该结点的后继。
代码实现不多做展示了哈~
我想正如程序员发觉单链表并不总能满足他们设计的程序某些要求的时候,发明了双向链表来弥补一样,线索二叉树也是在需求中被创造的!
那普通的二叉树到底有什么缺陷呢?
一,浪费空间。二,浪费时间,三,浪费青春
一共浪费了40个字节的空间。32b位的机器用32除以8等于4,这是代表一个指针用4个字节来表示。
结合上图我们发现一个树通过中序遍历,每隔开一个都有两个位置可以存放两个指针,一个存放前驱一个存放后继,如果想找到一个结点的前驱和后继通过这两个指针就可以了。
上图经过中序遍历后结果是
红色就是。后序和前序是不可以的。我们发现红色的结点都是刚才“^”造成浪费的结点,利用中序遍历刚好它们均处于字符中间,可以很好地利用“^”来存放前驱和后继的指针。
上图经过中序遍历后结果是
黄色说明只有一个空闲的指针位置,如果是这样的话我们就面临一个问题,机器怎么识别到底是存放指针还是线索?
通过上面的讲解,大家应该多少了解了线索二叉树是干什么的了。这里在总结一下就是,二叉树的普通存储结构是存在缺陷的,浪费空间等等,那么多空指针就是为了表明结束,但是我们通过观察发现当中序遍历二叉树的时候,会形成一种现象,每隔一个结点其实都存在两个空闲的指针Null,浪费了内存,我们可以将这指针作为一种索引指向结点的前驱或者后继,这样会减少浪费,并且在拿到一个结点的时候快速的找到它的前驱和后继。
为此呢,我们将已经定义好的结构进行“扩容”。
多了两个枚举类型的常量,用来作为标志,虽然结点的内存空间变大了,但是还是远远利大于弊。
ltag为0时候指向该结点的左孩子,为1时指向该结点的前驱。
rtag为0时指向该结点的右孩子,为1时指向该结点的后继。
代码实现不多做展示了哈~
相关文章推荐
- Mysql触发器
- 浮点数为什么不精确?
- libuv学习笔记(3)
- 2016计蒜之道初赛第四场---------淘宝流量分配【水题】
- task_struct结构体字段介绍--Linux中的PCB
- HTTPS与SSL(二)
- 字符串编码ASCII、Unicode和UTF-8
- 第十六周项目 阅读程序(9)
- HTTPS与SSL(二)
- bui上手体验
- 观察者模式
- i2c
- Java虚拟机(三):内存分配与回收策略
- TopDom找TAD
- HTTPS与SSL(一)
- HTTPS与SSL(一)
- 12_注解04_注解实现Action调用Service,Service调用Dao的过程
- spring源码解析(一)---占位符解析替换
- 【CodeVS3100】蜗牛
- linux c 获取系统当前时区