上一篇的《理解(二)》中漏掉了一点, 对二叉树进行线索化的时候,最后pre更新成为树中最右下角那个叶子节点,这个节点还没有线索化,需要对他单独线索化, 在函数最外面 pre->Rtga = Thread; pre->Rchild = NULL; 即可。
这里简单说下线索化二叉树的方法实现:
一、查找二叉树中序线索化后的第一个节点:其实就是中序遍历的最左边的节点。 放到线索化里面,就是递归左子树,直到左标记为线索 Ltag = thread 的那个节点。
二、查找二叉树中序线索化后的最后一个节点:其实就是中序遍历的最右变的节点。 放到线索化里面,就是递归右子树,直到右标记为线索, Rtag = thread的那个节点。
三、查找某节点的前驱:
(1)如果这个节点有左线索,那前驱就是leftchild;
(2)如果这个节点左标记为Link,那么按照中序遍历,这个节点的前驱就是“这个节点的左子树的最后一个节点”,用上面的方法二即可。
四、查找某节点的后继:
(1)如果这个节点有右线索,那后继就是rightchild;
(2)如果这个节点的右标记为Link,那么按照中序遍历,这个节点的后继就是“这个节点的右子树的第一个节点”,用上面的方法一即可。
五,根据数据域,查找某节点:
从“第一个节点”开始,依次查找“节点的后继”,遍历至“最后一个节点”,找到那个节点即可。
整体看来,有了线索后,查找节点的前驱和后继更加方便,搜索的逻辑也更简单,不需要像二叉树那样递归搜索。