首页 > 代码库 > 数据结构--线索二叉树
数据结构--线索二叉树
我们先来看一张之前整理过的一张二叉树的链式存储结构
1、每个数据域,都有2个指针域,分别指向该节点的左孩子、右孩子,但是每个节点前驱、后继,要知道的话需要遍历整棵树,这在时间上耗费很大。
2、另外,在叶子节点中,我们可以看到如图,每个节点都会浪费2块存储空间,N个节点的二叉树,2N个指针域,连接线为2N-1,那么会有2N-(N-1) = N+1个指针域浪费掉。
为了优化以上2个问题,我们引入了线索二叉树。
我们将二叉树中序遍历后。
我们把所有空指针域的右孩子,指向它的后继节点。如图
空指针域的左孩子,指向它的前驱。如图
我们把这种指向前序和后继的指针称为线索,加上线索的链表称为线索链表,相应的二叉树称为线索二叉树。
这样我们的指针域就都被使用上了,但是还存在另外一个问题,我们怎么区分左孩子、右孩子、前驱、后继,这些指针域呢?
所以这里我们要改下存储结构,对每个指针域增加一个标示ltag、rtag,如图
存储结构转化,0代表左孩子、右孩子指针域,1代表前驱、后继指针域,如图。
源码来自:http://www.cnblogs.com/ttltry-air/archive/2012/07/10/2584312.html
package com.test; class TBTreeNode { int data; int LTag; // 0,1 int RTag; // 0,1 TBTreeNode lchild; TBTreeNode rchild; public TBTreeNode(int data) { this(data, null, null, 0, 0); } public TBTreeNode(int data, TBTreeNode lchild, TBTreeNode rchild, int LTag, int RTag) { this.data = http://www.mamicode.com/data;>
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。