通过考察各种二叉链表,不管儿叉树的形态如何,空链域的个数总是多过非空链域的个数。准确的说,n各结点的二叉链表共有2n个链域,非空链域为n-1个,但其中的空链域却有n+1个。如下图所示。
因此,提出了一种方法,利用原来的空链域存放指针,指向树中其他结点。这种指针称为线索。
记ptr指向二叉链表中的一个结点,以下是建立线索的规则:
(1)如果ptr->lc...
分类:
其他好文 时间:
2014-11-16 17:23:11
阅读次数:
230
"."代表空树,程序分别以先序、中序和后序的方式递归遍历二叉树,再以中序非递归的方式遍历二叉树,并以中序递归方式输出叶子结点并统计叶子结点的个数。最后将二叉树线索化并中序遍历线索二叉树。...
分类:
其他好文 时间:
2014-11-03 10:18:08
阅读次数:
215
一、线索二叉树的原理
通过考察各种二叉链表,不管儿叉树的形态如何,空链域的个数总是多过非空链域的个数。准确的说,n各结点的二叉链表共有2n个链域,非空链域为n-1个,但其中的空链域却有n+1个。如下图所示。
因此,提出了一种方法,利用原来的空链域存放指针,指向树中其他结点。这种指针称为线索。
记ptr指向二叉链表中的一个结点,以下是建立线索的规...
分类:
其他好文 时间:
2014-10-26 18:30:03
阅读次数:
184
6.3线索二叉树(二叉树的线索化)
问题引入:以二叉链表作为存储结构时,只能得到结点的左、右孩子的信息,不能得到直接前驱、后继的信息。
问题解决:将二叉树线索化。
实现原理:n个结点的二叉树具有n+1个空指针域,利用这些空指针域存储结点的前驱、后继信息。
实质:线索化的实质是将二叉链表中的空指针改为指向前驱、后继的线索。
(1)二叉树的存储表示
enum {link,threa...
分类:
其他好文 时间:
2014-10-21 17:45:55
阅读次数:
207
我们在上一章中,学习了二叉树的数据结构。因为二叉树的特殊性,它不同于普通的树,所以可以使用顺序存储结构来存储。但是,用顺序存储结构会存在浪费空间的弊端。之后,我们学习了二叉链表。用链式存储结构存储树,结点结构为一个数据域data,两个指针域lchild、rchild。树的数据结构讲完了,但是没有讲怎...
分类:
其他好文 时间:
2014-10-16 18:33:42
阅读次数:
269
把三个二叉树遍历的题放在一起了。递归写法太简单,就不再实现了,每题实现了两种非递归算法。一种是利用栈,时间和空间复杂度都是O(n)。另一种是借助线索二叉树,也叫Morris遍历,充分利用树中节点的空指针域。先序:Binary Tree Preorder TraversalGiven a binary...
分类:
其他好文 时间:
2014-10-03 23:07:55
阅读次数:
341
前面实现了二叉树的二叉链表表示实现,当用二叉链表作为二叉树的存储结构时,因为每个结点中只有指向其左、右儿子结点的指针,所以从任一结点出发只能直接找到该结点的左、右儿子。在一般情况下靠它无法直接找到该结点在某种遍历序下的前驱和后继结点。如果在每个结点中增加指向其前驱和后继结点的指针,将降低存储空间的效...
分类:
其他好文 时间:
2014-09-30 14:16:39
阅读次数:
215
1 #include 2 #include 3 #include 4 #include 5 6 using namespace std; 7 8 struct TREE{ 9 int val;10 TREE *ch[2];11 TREE *thread;//该节点...
分类:
其他好文 时间:
2014-09-20 13:56:57
阅读次数:
165
遍历二叉树是按一定的规则将树中的结点排列成一个线性序列,即是对非线性结构的线性化操作。如何找到遍历过程中动态得到的每个结点的直接前驱和直接后继(第一个和最后一个除外)?如何保存这些信息?设一棵二叉树有n个结点,则有n-1条边(指针连线) , 而n个结点共有2n个指针域(Lchild和Rchild) ...
分类:
编程语言 时间:
2014-07-30 00:22:22
阅读次数:
593
typedef enum PointerTag{Link,Thread};
typedef struct{
char ch;
int num;
}ElemType;
typedef struct{
BiThrNode *lchild,*rchild;
PointerTag Ltag,Rtag;
ElemType d...
分类:
其他好文 时间:
2014-07-27 11:12:02
阅读次数:
208