线索化二叉树
思路
这里我们使用中根递归的方法实现对二叉树的线索化,步骤如下:
1.线索化当前结点的左子树
2.对当前结点进行操作(重点):
①如果当前结点左子树为空的话,将左引用指向当前节点的上一个结点(我们用一个变量来保存上一次执行操作的结点);
②如果上一个结点的右子树为空的话,将上一个结点的右引用置为当前结点。(当前操作我们是在为上一次的结点的有引用复制)。
3.线索化当前结点的右子树
代码实现(Java)
结点类定义:
public class Node {
private int id;
private Node left;
private Node right;
// 线索化二叉树需要的属性,为false时指向子结点,为true时指向前驱或后继结点
private boolean leftTag;
private boolean rightTag;
}
线索化二叉树的实现方法如下:
// 线索二叉树里指向当前结点的前一个结点
private static Node pre = null;
public static void threadedTree(Node node) {
if (node == null) {
return;
}
// 指向当前结点
Node temp = node;
// 中根顺序线索化左子树
threadedTree(temp.getLeft());
// 为当前结点线索化
// 当前结点左孩子结点为空,让其指向前驱节点
if (temp.getLeft() == null) {
temp.setLeft(pre);
temp.setLeftTag(true);
}
// 当前结点的后继结点其实是通过下一次的前驱节点来设置的
// 本次设置的是上一次的后继节点
if (pre != null && pre.getRight() == null) {
pre.setRight(temp);
pre.setRightTag(true);
}
// 操作完当前结点后,让pre移动到temp位置
pre = temp;
// 中根顺序线索化右子树
threadedTree(temp.getRight());
}
更多算法知识请关注微信公众号:青云学斋