基本概念
我们在对二叉树进行遍历的时候会产生一个遍历序列。而序列中的每个节点有前驱节点或后继节点。线索二叉树是在构建树的时候为每个节点添加一个前驱节点的指针和后继节点的指针。这样做是为了加快查找节点前驱和后继的速度。
二叉树的线索化通过是对于某个节点,若无左子树则令lchild指向其前驱节点,若无右子树则令rchild指向其后继节点。并且需要增加两个标志位来标志其左右指针是指向孩子还是指向前驱和后继。
线索二叉树构造
下面使用中序遍历对二叉树进行线索化处理。
public void inClue(Node p, Node pre){ if(p != null){ inClue(p.LChild, pre); if(p.LChild == null){ p.LChild = pre; p.ltag = true; //指向前驱节点,将标志位设为true } if(pre != null && pre.RChild == null){ pre.RChild = p; pre.rtag = true; //指向后继节点,将标志位设为true } pre = p; inClue(p.RChild, pre); } }
调用方式
public static void main(String[] args) { int[] num = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; BiTree biTree = new BiTree(num); System.out.println("线索化二叉树"); biTree.inClue(biTree.root, null); }
对线索二叉树的使用
查找中序序列中的第一个节点
//获取中序序列中的第一个节点 public Node firstNode(Node p){ while(p.ltag == false) p = p.LChild; return p; }
查找某个节点的后继
//求某个节点p的后继节点 public Node nextNode(Node p){ if(p.rtag == false) return firstNode(p); else return p.RChild; }