之前是对线索二叉树概念的理解了,从整体上了解了它以后就可以安心去研究他的算法实现和方法实现了。
(1)首先对于链式访问的两个节点a和b,如果我们先访问a再访问b,那我们可以得到2个信息:①b的前驱是a;②a的后继是b。
实际二叉树也是这样进行线索化的(pre就是a,BT就是b):
- if (!BT->Left) //如果该结点没有左孩子,利用左指针域指示这个节点的前驱,即①
- {
- BT->Ltag = Thread;
- BT->Left = pre;
- }
- if (!pre->Right) //如果先前访问的结点没有右孩子,利用它的右指针域指示它的后继 ,即②
- {
- pre->Rtag = Thread;
- pre->Right = BT;
- } //其他情况咱们不管,线索二叉树只处理这2种情况。能建立起线索就行了,要什么自行车!
按相同的思想访问接下来的c、d、、、等等节点就可以把线索建立起来。即 pre = BT;
(2)当然a、b、c、d的访问就是按照二叉树中序遍历的思想和方法即可。
-
InThreding(BT->Left);//递归左孩子线索化
-
TreadingFxn(); //线索化
-
InThreding(BT->Right);//递归右孩子线索化
这样线索化的方法基本就理解了,其实真的很简单,我这老人脑袋想了这么久才明白。。。。。。
线索化完了以后,二叉树就有了链式的属性,我们可以找到“头节点”“尾节点”,可以实现“查找某节点的前驱”,可以实现“查找某节点的后继”,可以实现“查找某节点的在二叉树中的父节点”,可以实现“查找某节点”等等方法,接下来继续分享。